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

7

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

Предположим, у меня есть папка с файлами, которую я хотел бы сжать в один zip-файл, который я могу поделиться с моими ужасными друзьями Windows (иначе я бы просто использовал tar и покончил с ним). Это выглядит так:

.
├── file1.txt
├── file2.txt
├── file3.txt
├── file.jpg
└── test.jpg

Предполагая, что у меня установлено zip :

sudo apt-get install zip

Я вижу из man zip , что он позволяет мне использовать список файлов:

  

- @ списки файлов. Если список файлов указан как - @ [Not on 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%)

Eureka! Я вижу, что 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, когда знаю, что я делаю.

    
задан Jeff Puckett 24.05.2016 в 22:30
источник

2 ответа

8

Я рад, что все в порядке, чтобы ответить на мой вопрос , потому что я хотел зафиксировать свою суматоху в надежде, что другие позади в моем следе слез можно было избавиться от поиска некоторых ключевых слов.

В конце концов я обнаружил правильный ответ , но он был отправлен в неправильный вопрос .

Несколько точек ясности:

  • Руководство не относится к литеральному списку, как в файле, а скорее к буквальному перечислению файлов на консоли.
  • Понятно, что кто-то может быть введен в заблуждение, думая, что foo относится к списку файлов, но на самом деле он предназначен для представления имени выходного zip-файла.
  • В этом примере список файлов опущен, потому что он использует переключатель -@ , который демонстрирует его "принимает список входных файлов из стандартного ввода вместо командной строки "

Понимая это, мы теперь вооружены различными способами для достижения цели.

Во-первых, используя созданный нами список файлов, мы можем прочитать список с cat и перенаправить вывод с каналом в качестве стандартного ввода в zip:

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

SWEET! Но кто хочет создать список использования в любое время? Это ужасный способ решения этого конкретного сценария. Было бы лучше получить список из ls и pipe для zip:

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, например:

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%)
    
ответ дан Jeff Puckett 24.05.2016 в 22:30
источник
4

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

zip -9 -r filename.zip /path/to/dir singlefile.jpg 
    
ответ дан Ansyori 09.05.2017 в 08:41
источник

Ознакомьтесь с другими вопросами по меткам