Пробачте це найосновніше запитання, але я не зміг знайти прямої відповіді чи простого прикладу обміну стеками.
Скажімо, у мене є папка файлів, яку я хотів би стиснути в один поштовий файл, яким я можу поділитися з моїми жахливими друзями з 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 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
. Також, використовуючи список імен файлів з файлу, ви можете використовувати перенаправлення замість того, щоб викликати окремий процес кішки,zip files.zip -@ < zip.lst