Пакетное сжатие нескольких папок в отдельные файлы ZIP

12

У меня есть десятки папок, которые мне нужно сжать в отдельные zip-файлы.

Если я выбираю все эти папки в Finder и выполняю «Сжатие [X] элементов», я получаю один zip-файл, содержащий все папки, тогда как мне нужен один zip-файл на папку.

Я попытался создать рабочий процесс с помощью Automator с помощью действия «Создать архив», но он ведет себя одинаково: при вводе нескольких файлов / папок выводится один zip-файл. Нет способа указать, что действие выполняется для каждого элемента в отдельности.

По сути, я ищу способ избежать необходимости утомительного запуска «Compress» в Finder для каждой папки по одной. Есть ли способ автоматизировать это?

daGUY
источник
1
Я обновил свой ответ, чтобы улучшить код, используемый для увеличения имени файла zip-архива, чтобы он эмулировал, как команда контекстного меню Finder Compress [n] Items увеличивает имя файла.
user3439894
Извините, я обновил код еще раз, чтобы удалить ненужные popdи исправил фатальную опечатку for i in $bn*.zip; do, которая должна была быть for i in $bn *.zip; do. Обратите внимание на пространство между $bnи *.zip, оно отсутствовало и не должно было быть. Поэтому, пожалуйста, обновите его в своей реализации, в противном случае он вступит в действие, File Name 2.zipкогда в basenameнем будет пробел.
user3439894

Ответы:

14

Вот Automator служба 1 , которая становится доступной в Finder , если папки выбраны и эмулирует в контекстно-меню Сжать [п] Элементы команды за исключением того, что создает отдельный файл зип архива для каждой выбранной папки в имени выбранной папки . Если файл имени папки.zip уже существует, к имени файла добавляется " 2"( пробел 2) , например, имя папки 2.zip . Это гарантирует существующий файл архива zipне затрагивается, и имя файла zip-архива будет автоматически увеличиваться по мере необходимости.

1 В macOS Mojave и более поздних версиях служба Automator называется Quick Action . Есть и другие незначительные различия в номенклатуре, но они должны быть более очевидными при сравнении их с рабочими процессами Mojave Automator до MacOS.

Чтобы создать сервис: 1

  1. Откройте Automator и выберите « Сервис или « Файл» > « Создать» > « Сервис», если Automator уже открыт.

  2. Набор услуги принимают выбранные для папок и в к Finder .

  3. Добавление сценария Run Shell Action , установка Shell: в / бен / Баш и ввода Pass: в качестве аргументов и добавьте следующий код :

    for f in "$@"; do
    
        dn="$(dirname "$f")"
        bn="$(basename "$f")"
    
        cd "$dn" || exit
    
        if [[ ! -e "$bn.zip" ]]; then
            ditto -c -k --sequesterRsrc --keepParent "$f" "$bn.zip"
        else
            n=2
            for i in $bn *.zip; do
                if [[ "$bn $n.zip" == "$i" ]]; then
                    n="$(( n + 1 ))"
                fi
            done
            ditto -c -k --sequesterRsrc --keepParent "$f" "$bn $n.zip"
        fi
    
    done
    
    afplay /System/Library/Sounds/Purr.aiff
  4. Сохранить службу как: отдельно сжимать папки

Чтобы воспользоваться услугой:

В Finder или на рабочем столе выберите несколько папок , затем щелкните правой кнопкой мыши и выберите « Сжать папки отдельно» в разделе « Службы» .

Или после выбора целевых папок вы также можете щелкнуть Finder > Services > Compress Folders отдельно от строки меню .

Вот вам и способ сжать несколько папок по отдельности и одновременно в отдельных zip-архивах, эмулируя, как Finder создает файл zip-архива. Значение архива почтового индекса содержит сохраненные вилки ресурсов и HFS мету-данные в подкаталоге __MACOSX и встраивает только имя родительского каталога источник в целевом архиве , а не полное имя путь , как при использовании zip(без -j) , чтобы создать архив.

Изображение папок сжатия отдельно

Сжатие папок отдельно - Automator Service

user3439894
источник
Я проверил ваше решение и @ ababak's. Они дают точно такой же результат, и ababak гораздо проще реализовать. Я все равно проголосовал за оба.
Turzifer
15

Есть альтернативное решение, которое встроено, если вы не хотите использовать Automator и можете изменить настройки утилиты архивирования.

  1. Откройте Archive Utility.app, расположенный в / System / Library / CoreServices / Applications /
  2. Перейдите в Файл> Настройки
  3. Измените настройку «Использовать формат архива» на «Zip-архив»
  4. Перетащите папки на значок в доке.
ababak
источник
хорошая особенность этой опции в том, что вы можете установить предпочтения Archive Utility.app, чтобы переместить оригинал в корзину после его завершения, он не ограничен папками. Есть ли способ настроить службу Automator для открытия с Archive Utility.app в качестве службы, если вы хотите щелкнуть правой кнопкой мыши в качестве опции? Я столкнулся с ограничением, поскольку Archive Utility.app нельзя выбрать с помощью действия «Запустить приложение».
thepen
@ thepen, конечно, вы можете выбрать Archive Utility в качестве действия запуска приложения. Вам просто нужно выбрать «Other…» и перейти к его местоположению, которое является /System/Library/CoreServices/Applications/(вы можете нажать Cmd-Shift-G, когда открыто диалоговое окно выбора файла, чтобы вставить этот путь для быстрой навигации)
ababak
В чем разница между «форматом архива» и «архивом zip»?
user1993
Этот метод намного упрощает рабочий процесс. Я попробовал команду: для элемента в *; do zip "$ {item} .zip" "$ {item}"; сделано в терминале, но это не сработало. Неизвестно, почему, но я не хотел тратить время на то, чтобы понять это. Это работало просто отлично.
ArchonOSX