Признаю, что этот вопрос уже задавался здесь:
НравитьсяАрхивировать в отдельные файлыпри этом спрашивающий не указал используемую им ОС и не получил ответа.
Мне нужно разделить огромный каталог на несколько .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 *
) на мой взгляд является довольно некрасивым синтаксисом и, скорее всего, приведет к сбоям, например, в файлах с пробелами в имени или из-за слишком большого количества аргументов.