3

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

Как Zip в отдельных файлах, где человек, который спросил, не указал ОС, которую он использовал, и не получил ответов.

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

file1.zip
file2.z01
file3.z02

Я хотел бы следующий набор файлов вместо:

file1.zip
file2.zip
file3.zip

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

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

Ответ правильный, но он приведет к созданию файлов tar:

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

Любая помощь с этим приветствуется.


PS: эта последняя часть только для тех из вас, кто вписывается в Keyboard Maestro:

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

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

Благодарю.

1 ответ1

14

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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .