Batch kompresuje wiele folderów do indywidualnych plików zip

12

Mam dziesiątki folderów, które muszę skompresować do pojedynczych plików zip.

Jeśli wybiorę wszystkie te foldery w Finderze i zrobię „Kompresuj [X] elementy”, otrzymam jeden plik zip zawierający wszystkie foldery, a tym, czego chcę, jest jeden plik zip na folder.

Próbowałem utworzyć przepływ pracy za pomocą Automatora przy użyciu akcji „Utwórz archiwum”, ale zachowuje się tak samo: wprowadzanie wielu plików / folderów powoduje utworzenie jednego pliku zip. Nie ma sposobu, aby określić, że akcja będzie uruchamiana dla każdego elementu osobno.

Zasadniczo szukam sposobu na uniknięcie żmudnego uruchamiania „Kompresowania” w Finderze w każdym folderze pojedynczo. Czy jest jakiś sposób na zautomatyzowanie tego?

DaGUY
źródło
1
Zaktualizowałem swoją odpowiedź, aby poprawić kod używany do zwiększania nazwy pliku archiwum zip, aby emulował on, w jaki sposób polecenie kompresuj w menu kontekstowym Findera [n] Elementy zwiększa nazwę pliku.
user3439894
Przepraszam, zaktualizowałem kod jeszcze raz, aby usunąć niepotrzebne popdi poprawiłem fatalną literówkę for i in $bn*.zip; do, która powinna była być for i in $bn *.zip; do. Zwróć uwagę na odstęp między $bni *.zip, brakowało go i nie powinno być. Zaktualizuj go więc w swojej implementacji, w przeciwnym razie będzie działał, File Name 2.zipgdy basenamebędzie w nim miejsce.
user3439894

Odpowiedzi:

14

Oto usługa Automatora 1, która staje się dostępna w Finderze po wybraniu folderów i emuluje menu kontekstowe Polecenie Kompresuj [n] Elementy, z wyjątkiem tego, że tworzy osobny plik archiwum zip dla każdego wybranego folderu w nazwie wybranego folderu . Jeśli plik Name.zip folderu już istnieje, wówczas do nazwy pliku dołączane jest ( spacja 2) , np. Nazwa folderu 2.zip . Zapewnia to istniejący plik archiwum zip " 2"nie zostanie dotknięty, a nazwa pliku archiwum zip zostanie automatycznie zwiększona w razie potrzeby.

1 W systemie macOS Mojave i nowszych usługa Automatora nazywa się Szybką akcją . Istnieją również inne drobne różnice w nomenklaturze, ale powinny one być bardziej oczywiste, porównując je z obiegami pracy Mojave Automator w wersji wcześniejszej niż macOS.

Aby utworzyć usługę: 1

  1. Otwórz Automator i wybierz Usługa 1 lub Plik > Nowy > Usługa, jeśli Automator jest już otwarty.

  2. Zestaw usługi odbiera wybrany do folderów oraz w celu Finder .

  3. Dodaj Run Script Shell działanie , ustawienie Shell: do / bin / bash i wejścia hasło: aby jako argumenty i dodaj następujący kod :

    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. Zapisz usługę jako: osobno kompresuj foldery

Aby skorzystać z usługi:

W Finderze lub na pulpicie wybierz wiele folderów , a następnie kliknij prawym przyciskiem myszy i wybierz opcję Kompresuj foldery osobno w obszarze Usługi .

Lub po wybraniu folderów docelowych możesz również kliknąć Finder > Usługi > Kompresuj foldery osobno z paska menu .

Masz, sposób kompresji wielu folderów osobno i jednocześnie w osobnych archiwach zip, jednocześnie emulując sposób, w jaki Finder tworzy plik archiwum zip. Oznacza to, że archiwum zip zawiera zachowane rozwidlenia zasobów i metadane HFS w podkatalogu __MACOSX i osadza źródło źródłowej nazwy katalogu nadrzędnego w archiwum docelowym , a nie w pełni kwalifikowaną nazwę ścieżki, jak przy użyciu zip(bez -j) do utworzenia archiwum.

Obraz folderów kompresji osobno

Kompresuj foldery osobno - usługa Automatora

użytkownik3439894
źródło
Sprawdziłem zarówno twoje rozwiązanie, jak i @ ababak's. Dają dokładnie taki sam wynik, a ababak jest znacznie łatwiejszy do wdrożenia. I tak głosowałem w obu przypadkach.
turzifer
15

Istnieje alternatywne rozwiązanie, które jest wbudowane, jeśli nie chcesz korzystać z Automatora i nie masz nic przeciwko zmianie ustawień Narzędzia do archiwizacji.

  1. Otwórz Archiwum Utility.app znajdujące się w / System / Library / CoreServices / Applications /
  2. Przejdź do Plik> Preferencje
  3. Zmień preferencję „Użyj formatu archiwum” na „Archiwum zip”
  4. Przeciągnij i upuść foldery do ikony w doku.
ababak
źródło
miłą rzeczą w tej opcji jest to, że możesz ustawić preferencje Archive Utility.app, aby przenieść oryginał do kosza po jego zakończeniu, nie ogranicza się to do folderów. Czy istnieje sposób skonfigurowania usługi Automator do otwierania za pomocą Archive Utility.app jako usługi, jeśli chcesz jako opcję kliknąć prawym przyciskiem myszy? Wystąpiło ograniczenie, ponieważ Archive Utility.app nie może zostać wybrany za pomocą akcji Uruchom aplikację.
thepen
@thepen, oczywiście możesz wybrać narzędzie archiwizujące jako akcję uruchamiania aplikacji. Musisz tylko wybrać „Inne…” i przejść do jego lokalizacji, którą jest /System/Library/CoreServices/Applications/(możesz nacisnąć Cmd-Shift-G, gdy okno dialogowe wyboru pliku jest otwarte, aby wkleić tę ścieżkę do szybkiej nawigacji)
ababak
jaka jest różnica między „formatem archiwum” a „archiwum zip”?
user1993
Ta metoda jest znacznie łatwiejszym przepływem pracy. Próbowałem polecenia: dla pozycji w *; wykonaj zip „$ {item} .zip” „$ {item}”; zrobione w terminalu, ale nie działało poprawnie. Nie wiadomo, dlaczego, ale nie chciałem się zastanawiać. To działało dobrze.
ArchonOSX