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 .zip
plikami, które zawierają spakowaną zawartość każdego podkatalogu.
Czy coś takiego jest możliwe? Jeśli tak, pokaż mi, jak to się robi.
command-line
directory
zip
Evster
źródło
źródło
Odpowiedzi:
Możesz użyć tej pętli w
bash
:i
jest 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ścd
we 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,$i
ale 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
echo
przedzip
i, a zobaczysz polecenia wydrukowane zamiast wykonanych.źródło
*/
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 zecho
nim 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 d
innych sztuczek.zip
plik 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 dotglob
aby wzorce globu pasowały również do ukrytych plików.for i in */; do (cd "$i"; zip -r "../${i%/}.zip" .); done