Как делают меня на молнии несколько файлов на командной строке?

Простите этот самый основной вопрос, но я не мог найти прямой ответ или простой пример на обмене стека.

Скажем, у меня есть папка файлов, которые я хотел бы сжать в один 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, когда я знаю то, что я делаю.

16
задан 23 May 2017 в 05:39

2 ответа

Используйте файл < перенаправление

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%)
21
ответ дан 23 November 2019 в 02:32

самая простая команда с макс. уровнем сжатия

zip -9 -r filename.zip /path/to/dir singlefile.jpg 
6
ответ дан 23 November 2019 в 02:32

Другие вопросы по тегам:

Похожие вопросы: