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

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

Признаю, что этот вопрос уже задавался здесь:

НравитьсяАрхивировать в отдельные файлыпри этом спрашивающий не указал используемую им ОС и не получил ответа.

Мне нужно разделить огромный каталог на несколько .zip-файлов, которые не зависят друг от друга. Поэтому вместо:

файл1.zip
файл2.z01
файл3.z02

Вместо этого я хотел бы получить следующий набор файлов:

файл1.zip
файл2.zip
файл3.zip

В общем, вот мой вопрос. Я работаю на OS X, поэтому скрипт оболочки или AppleScript был бы самым простым способом.

Кроме того, вот парень, который спросил то же самое - только он хотел создать архив .tar: КакСоздание отдельных архивов для набора файлов

Ответ правильный, но результатом будут файлы tar:

for file in `ls *`; do tar -czvf $file.tar.gz $file ; done

PS: Последняя часть только для тех из вас, кто в форме Keyboard Maestro:

Я также пытался выполнить это в Keyboard Maestro, у меня есть настройка действия "for each", которая определяет пути к файлам, а затем запускает скрипт оболочки. Вывод правильный, и макрос работает, если я вставляю его в терминал (например, zip /Users/me/Desktop/test /Users/me/Desktop/test.txt).

Однако, когда я передаю две переменные в скрипт оболочки в Keyboard Maestro, он не работает:
zip "$KMVAR_zipPath" "$KMVAR_sourcePath"

решение1

Решение довольно простое. Если вы хотите сделать это для каждого файла, рекурсивно, используйте find. Он выведет список всех файлов и каталогов, включая подкаталоги.

find . -type f -execdir zip '{}.zip' '{}' \;

Объяснение:

  • Первый аргумент — это каталог, с которого вы хотите начать,.
  • Затем мы ограничим его поиском только файлов ( -type f)
  • Эта -execdirопция позволяет нам запускать команду для каждого найденного файла, выполняя ее из каталога файла.
  • Эта команда оценивается как zip file.txt.zip file.txt, например, поскольку все вхождения {}заменяются фактическим именем файла. Эту команду необходимо закончить с помощью\;

Конечно, findимеет больше возможностей. Если вместо этого вы просто хотите остаться в текущем каталоге, не спускаясь в подкаталоги:

find . -type f -maxdepth 1 -execdir zip '{}.zip' '{}' \;

Если вы хотите ограничить его определенными типами файлов, используйте опцию -name(или -inameдля сопоставления без учета регистра):

find . -type f -name "*.txt" …

Все остальное (включая цикл по forвыходным данным ls *) на мой взгляд является довольно некрасивым синтаксисом и, скорее всего, приведет к сбоям, например, в файлах с пробелами в имени или из-за слишком большого количества аргументов.

Связанный контент