Простите этот самый основной вопрос, но я не мог найти прямой ответ или простой пример на обмене стека.
Скажем, у меня есть папка файлов, которые я хотел бы сжать в один 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
Но это не сделало ничего кроме, создают пустую строку на консоли. И я могу продолжать продвигать, Входят, и это просто продолжает делать более пустые строки, по-видимому не выполняя команду. После некоторого поиска я понял, что должен был завершить введенный путем нажатия 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-файл. Этот error'd, потому что по умолчанию это пыталось создать названный 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
Нет! Ну, на самом деле это имеет смысл от стандартного использования, потому что это просто архивировало один файл списка, который я дал ему. Наконец я попробовал еще раз с -@
но получил тот же результат.
Что я делаю неправильно?
BTW, я знаю, что могу использовать GUI и сделать это с моей мышью, но я должен написать сценарий этого, и в целом я быстрее на CLI, когда я знаю то, что я делаю.
Используйте файл <
перенаправление
zip files.zip -@ < zip.lst
Или Вы могли пропустить список и просто шарик
zip files.zip *.txt *.jpg
спасибо steeldriver
Я рад, что нормально отвечать на мой собственный вопрос, потому что я хотел вести хронику своей суматохи в надеждах, что другие после позади в моем следе слез могли быть сэкономлены путем поиска некоторых ключевых слов.
В конечном счете я обнаружил правильный ответ, но он был отправлен на неправильный вопрос.
Пара точек ясности:
foo
упомянутый список файлов, но это на самом деле предназначается для представления названия выходного zip-файла.-@
переключатель, который демонстрирует это, "берет список входных файлов от стандартного входа вместо из командной строки"Понимая это, мы теперь вооружены множеством способов выполнить цель.
Во-первых использование списка файлов, который мы создали, мы можем считать список с cat
и перенаправьте вывод с каналом как стандартный вход для архивирования:
cat zip.lst | zip -@ files.zip
adding: file1.txt (stored 0%)
adding: file2.txt (stored 0%)
adding: file3.txt (stored 0%)
adding: file.jpg (stored 0%)
adding: test.jpg (stored 0%)
Наблюдение этого adding: ...
поскольку каждый файл является, конечно, хорошим знаком, но у нас были наши надежды прежде, поэтому позвольте нам просто подтвердить:
unzip -l files.zip
Archive: files.zip
Length Date Time Name
--------- ---------- ----- ----
0 2016-05-24 14:54 file1.txt
0 2016-05-24 14:54 file2.txt
0 2016-05-24 14:54 file3.txt
0 2016-05-24 15:00 file.jpg
0 2016-05-24 14:59 test.jpg
--------- -------
0 5 files
СЛАДКИЙ! Но кто хочет создать список одноразового использования так или иначе? Это - ужасный окольный способ решить этот конкретный сценарий. Было бы лучше получить список от ls
и канал, что для архивирования:
ls | zip -@ files.zip
adding: file1.txt (stored 0%)
adding: file2.txt (stored 0%)
adding: file3.txt (stored 0%)
adding: file.jpg (stored 0%)
adding: test.jpg (stored 0%)
Сказочно! Теперь давайте создадим фильтры с ужасающей силой grep
только к на молнии jpg's, например:
ls | grep .jpg | zip -@ images.zip
adding: file.jpg (stored 0%)
adding: test.jpg (stored 0%)
Или просто файлы, начинающиеся с "файла"
ls | grep file. | zip -@ files.zip
adding: file1.txt (stored 0%)
adding: file2.txt (stored 0%)
adding: file3.txt (stored 0%)
adding: file.jpg (stored 0%)
самая простая команда с макс. уровнем сжатия
zip -9 -r filename.zip /path/to/dir singlefile.jpg