Простите за этот самый основной вопрос, но я не смог найти прямой ответ или простой пример по обмену стека.
Допустим, у меня есть папка с файлами, которую я хотел бы сжать в один zip-файл, которым я мог бы поделиться со своими ужасными друзьями из Windows (иначе я бы просто использовал tar
и покончил с этим). Это выглядит так:
.
├── file1.txt
├── file2.txt
├── file3.txt
├── file.jpg
└── test.jpg
Предполагая, что я zip
установил:
sudo apt-get install zip
Я вижу, man zip
что это позволяет мне использовать список файлов:
- @ списки файлов. Если список файлов указан как - @ [Не в MacOS], zip берет список входных файлов из стандартного ввода, а не из командной строки. Например,
zip -@ foo
Итак, я создал zip.lst
что выглядит так:
cat zip.lst
file1.txt
file2.txt
file3.txt
file.jpg
test.jpg
И теперь я попробовал:
zip -@ zip.lst
Но он ничего не делал, кроме создания пустой строки на консоли. И я могу продолжать нажимать, Enterи он просто продолжает делать больше пустых строк, не выполняя, казалось бы, команду. После некоторых поисков я понял, что мне нужно прекратить ввод, нажав Ctrl+D
Но теперь я получаю эту ошибку:
zip warning: missing end signature--probably not a zip file (did you
zip warning: remember to use binary mode when you transferred it?)
zip warning: (if you are trying to read a damaged archive try -F)
zip error: Zip file structure invalid (zip.lst)
Какая!? Как мой простой список не является "допустимой файловой структурой"? Обратитесь к руководству для получения дополнительной информации, и я более подробно рассмотрю:
Если список файлов указан как - @ ...
Поэтому я пробую это без -@
, и это, по крайней мере, обрабатывает его сразу, не нажимая Ctrl+, Dно у меня остается та же ошибка .
К счастью, я нашел комментарий к ответу на почти не связанный вопрос, который привел меня к осознанию того, что мне нужно явно назвать zip-файл. Эта ошибка была вызвана тем, что по умолчанию она пыталась создать zip-файл с именем zip.lst
. Но так как это название моего списка, можно подумать, что он просто перезапишет его, но нет, на самом деле он пытался обновить его. И поскольку список, очевидно, не является zip-файлом, мы получаем ошибку неверной структуры файла, и теперь понятно, почему он сказал «вероятно, не zip-файл». И тогда я попробовал:
zip files.zip zip.lst
adding: zip.lst (deflated 35%)
Эврика! Я вижу, что zip-файл был создан, и моя папка теперь содержит это:
.
├── file1.txt
├── file2.txt
├── file3.txt
├── file.jpg
├── files.zip
├── test.jpg
└── zip.lst
Но подождите, прежде чем мы отпразднуем, давайте сначала подтвердим содержимое zip-файла:
unzip -l files.zip
Archive: files.zip
Length Date Time Name
--------- ---------- ----- ----
48 2016-05-24 15:30 zip.lst
--------- -------
48 1 file
Нет! Ну, на самом деле это имеет смысл из стандартного использования, потому что он просто сжал один файл списка, который я дал. Наконец я попробовал еще раз, -@
но получил тот же результат.
Что я делаю неправильно?
Кстати, я знаю, что могу использовать графический интерфейс и делать это с помощью мыши, но мне нужно написать скрипт, и в целом я быстрее использую CLI, когда знаю, что делаю.
ls
иgrep
и zip-@
можно использовать глобусы оболочки для выбора файлов непосредственно в командной строке zip, напримерzip files.zip file*
илиzip images.zip *.jpg
. Кроме того, при использовании списка имен файлов из файла вы можете использовать перенаправление вместо вызова отдельного процесса cat,zip files.zip -@ < zip.lst
find
вместоls
самая простая команда с максимальным уровнем сжатия
источник