polecenie spakowania wielu katalogów do poszczególnych plików zip


40

Mam jeden katalog, który zawiera dziesiątki katalogów.

Jestem nowy w wierszu poleceń i staram się wymyślić polecenie, które spakuje każdy podkatalog do unikalnego pliku podkatalogu.zip.

Na koniec mój katalog główny zostanie wypełniony wszystkimi moimi oryginalnymi podkatalogami, a także odpowiadającymi im .zipplikami, które zawierają spakowaną zawartość każdego podkatalogu.

Czy coś takiego jest możliwe? Jeśli tak, pokaż mi, jak to się robi.


Sugeruję, abyś sprawdził, w jaki sposób można wykonać „dla pętli” w powłoce. Istnieją onlinery, które mogą robić, co chcesz, ale ładna pętla będzie znacznie wyraźniejsza.
lynxlynxlynx

Czy to oznacza, że ​​muszę napisać osobny skrypt powłoki, a następnie wywołać ten skrypt z wiersza poleceń? Przepraszam za tak podstawowe pytanie. Chociaż mam trochę doświadczenia w programowaniu, te rzeczy są dla mnie nowe.
Evster,

Odpowiedzi:


75

Możesz użyć tej pętli w bash:

for i in */; do zip -r "${i%/}.zip" "$i"; done

ijest nazwą zmiennej pętli. */oznacza każdy podkatalog bieżącego katalogu i będzie zawierać ukośnik końcowy w tych nazwach. Upewnij się, że jesteś cdwe właściwym miejscu przed wykonaniem tego. "$i"po prostu nazwij ten katalog, w tym ukośnik końcowy. Znaki cudzysłowu zapewniają, że białe spacje w nazwie katalogu nie powodują problemów. ${i%/}jest jak, $iale z usuniętym końcowym ukośnikiem, więc możesz użyć tego do skonstruowania nazwy pliku zip.

Jeśli chcesz zobaczyć, jak to działa, dołącz echoprzed zipi, a zobaczysz polecenia wydrukowane zamiast wykonanych.


Dzięki, wygląda świetnie! Jednak jeden potencjalny problem, o którym myślałem: czy spakuje WSZYSTKIE katalogi w każdym podkatalogu do osobnych plików? Chcę tylko spakować podkatalogi pierwszego poziomu jako pojedyncze skompresowane pliki. Nie chcę tworzyć dodatkowych plików zip dla podkatalogów 2. poziomu, 3. poziomu itp. Daj mi znać, jeśli to ma sens. Dzięki jeszcze raz!
Evster,

Tylko te pierwszego poziomu, o które prosiłeś.
lynxlynxlynx

Te */nazwy każdy bezpośredni podkatalogów, nie każdy katalog potomek. Dostaniesz więc zamki tylko na najwyższy poziom, dokładnie tak, jak chcesz. Wersja z echonim wykazałaby ten aspekt. Spakowanie każdego zagnieżdżonego katalogu do własnego pliku byłoby w rzeczywistości większym nakładem pracy i prawdopodobnie najlepiej byłoby go rozwiązać za pomocą find -type dinnych sztuczek.
MvG

1
@fritzmg: Lokalny test na moim systemie Linux sugeruje, że tak, pliki zaczynające się od kropki są uwzględnione. Byłaby to właściwość narzędzia Info-ZIP, a nie polecenia, które wydałem, więc w zależności od tego, jaki jest twój zipplik binarny, możesz uzyskać inne zachowanie. Aby również utworzyć pliki zip dla katalogów najwyższego poziomu (tj. Dzieci bieżącego katalogu) zaczynających się od kropki, możesz użyć, shopt -s dotglobaby wzorce globu pasowały również do ukrytych plików.
MvG

1
Aby utworzyć plik zip, który nie ma katalogu głównego jako katalogu głównego:for i in */; do (cd "$i"; zip -r "../${i%/}.zip" .); done
chris
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.