Как использовать 7z для архивирования всех файлов и каталогов (в том числе скрытых) в каталоге?

10

Из-за специфики моих потребностей в архивировании я не очень хорошо разбираюсь в твердых архивах tar.gz и вместо этого использую 7z.

Я использую следующую команду для этого:

7z a -t7z -m0=lzma -mx=9 -mfb=64 -md=32m -ms=off ~/my/folder.7z ~/my/folder/*

Создать архив всего внутри ~/my/folder/как ~/my/folder.7zфайл.

Но ~/my/folder/.hiddenFolderтогда не попаду в архив. Как это исправить? Не *должен вернуть все файлы и папки?

Иван
источник
Вы используете расширение пути bash последним *, попробуйте удалить его, 7z должен заархивировать весь каталог.
энзотиб
@enzotib, но я не хочу каталог в архиве, только то, что внутри. И именно поэтому я пометил вопрос bash- может быть, я неправильно использую «расширение пути bash»?
Иван

Ответы:

8

Если вы хотите, чтобы содержимое одного каталога было проще, сначала измените его:

cd ~/my/folder
7z a -t7z -m0=lzma -mx=9 -mfb=64 -md=32m -ms=off ~/my/folder.7z .

То, что вы видели, это то, что *расширяется до списка имен файлов, которые не начинаются с .. Это задокументированное поведение, и это основная причина, по которой файлы, имена которых начинаются с символа, .называются скрытыми (другая причина - lsони не отображаются по умолчанию).

Не существует действительно удобного переносимого способа перечисления всех файлов в каталоге. Ты можешь использовать

~/my/folder/..?* ~/my/folder/.[!.]* ~/my/folder/*

но если нет файла, соответствующего одному из шаблонов, шаблон останется нерасширенным. В bash вы можете установить dotglobопцию, чтобы избежать особой обработки ведущего .( .и ..все еще исключены из матчей):

shopt -s dotglob
7z a -t7z -m0=lzma -mx=9 -mfb=64 -md=32m -ms=off ~/my/folder.7z ~/my/folder/*

В ksh или в bash, если вы установили extglobпараметр (или в zsh, если вы установили ksh_globпараметр), вы можете написать шаблон, который соответствует всем файлам, кроме .и ..:

7z a -t7z -m0=lzma -mx=9 -mfb=64 -md=32m -ms=off ~/my/folder.7z ~/my/folder/@(..?*|.[!.]*|*)

В zsh есть более простой способ сказать, что .не должен обрабатываться специально в шаблоне:

7z a -t7z -m0=lzma -mx=9 -mfb=64 -md=32m -ms=off ~/my/folder.7z ~/my/folder/*(D)
Жиль "ТАК - перестань быть злым"
источник
9

TL; DR

7z a -t7z -m0=lzma -mx=9 -mfb=64 -md=32m -ms=off ~/my/folder.7z ~/my/folder/.

Больше примеров

Пример структуры каталогов

test1
├── .hidden
└── normal.txt

0 directories, 2 files

Попробуйте следующие команды

  1. Корневая папка со всем ее содержимым.

    7za a test1_a.7z ~/test1/

    дает

        Date      Time    Attr         Size   Compressed  Name
    ------------------- ----- ------------ ------------  ------------------------
    2017-08-06 09:23:51 D....            0            0  test1
    2017-08-06 09:23:44 ....A            0            0  test1/.hidden
    2017-08-06 09:23:51 ....A            0            0  test1/normal.txt
    ------------------- ----- ------------ ------------  ------------------------
    2017-08-06 09:23:51                  0            0  2 files, 1 folders
  2. Нет корневой папки и нет скрытых файлов

    7za a test1_b.7z ~/test1/*

    дает

       Date      Time    Attr         Size   Compressed  Name
    ------------------- ----- ------------ ------------  ------------------------
    2017-08-06 09:23:51 ....A            0            0  normal.txt
    ------------------- ----- ------------ ------------  ------------------------
    2017-08-06 09:23:51                  0            0  1 files
  3. Нет корневой папки, но скрытые файлы включены (это то, что мы обычно хотим)

    7za a test1_c.7z ~/test1/.

    дает

       Date      Time    Attr         Size   Compressed  Name
    ------------------- ----- ------------ ------------  ------------------------
    2017-08-06 09:23:44 ....A            0            0  .hidden
    2017-08-06 09:23:51 ....A            0            0  normal.txt
    ------------------- ----- ------------ ------------  ------------------------
    2017-08-06 09:23:51                  0            0  2 files
стил
источник
Да, только что проверил это, и это намного аккуратнее, чем использование shopt.
будет
Лучший ответ здесь. Спасибо.
Марцин
4

Нет, *не предполагается возвращать все файлы. Возвращает только видимые.

Более простое решение:

cd ~/my/folder
7z a -t7z -m0=lzma -mx=9 -mfb=64 -md=32m -ms=off ~/my/folder.7z .
andcoz
источник