W Linuksie jaki byłby najlepszy sposób rekurencyjnego spakowania wielu katalogów jednocześnie? [duplikować]

1

To pytanie ma już odpowiedź tutaj:

Mam katalog /diri jest pełen innych katalogów bez wspólnego schematu nazewnictwa. Tak /dir/EqcWTG /dir/SomeDirectoryName /dir/3435346i tak dalej.

Chciałbym przekształcić każdy z tych katalogów w plik zip. Zasadniczo chcę uruchomić $ zip -r directoryname.zip directorynamew każdym katalogu w $(pwd).

Jaki byłby najłatwiejszy sposób na osiągnięcie tego?

Kefka
źródło

Odpowiedzi:

3

Korzystanie z findtego powinno działać:

find /dir -not -name "dir" -maxdepth 1 -type d -exec zip -r '{}.zip' '{}' \;

Zauważ, że mam /dirjako główną findścieżkę, ale mam też -not -name "dir", że katalog nadrzędny nie jest archiwizowany. Następnie ograniczamy głębokość findskanu, za -maxdepth 1pomocą którego środki findbędą szukać tylko bezpośrednich potomków ścieżki /dir. Następnie upewniamy się, że działamy tylko na katalogach z -type d. Na koniec używamy -execmagicznego zippolecenia, które rekurencyjnie kompresuje wszystkie znalezione katalogi; {}po prostu odpowiada samej nazwie katalogu.

Innym taktem byłoby użycie -mindepth 1zamiast -not -name "dir"na wypadek, gdyby zagnieżdżony katalog w /dirstrukturze nadrzędnej w jakiś sposób również nosił nazwę /dirlub ma „dir” jako część swojej nazwy:

find /dir -mindepth 1 -maxdepth 1 -type d -execdir echo {} \;

Teraz utworzyliby archiwa ZIP, które rozwiną się do pełnej /dirścieżki; /dir/EqcWTG, /dir/SomeDirectoryName, /dir/3435346, Itp ... Jeśli chciałeś autonomiczny / względnych archiwów ZIP można użyć -execdirzamiast -exectak:

find /dir -not -name "dir" -maxdepth 1 -type d -execdir zip -r '{}.zip' '{}' \;

Sam -execdirpomysł, ale -mindepth 1zamiast -not -name "dir":

find /dir -mindepth 1  -maxdepth 1 -type d -execdir zip -r '{}.zip' '{}' \;

Ponieważ -execdirwymusza findpolecenie, aby działać w rzeczywistym katalogu on znalazł coś-zamiast pełnej ścieżki-tego polecenia spowodowałoby podobnie nazwanych archiwów ZIP, które rozszerzają się do względnych katalogach nazwanych EqcWTG, SomeDirectoryName, 3435346, etc ... Ale znowu, końcowe wykorzystanie / opcje wybierz wszystko zależy od twoich ostatecznych potrzeb archiwizacji ZIP.

JakeGould
źródło
1
Może być lepiej wykluczyć /dirza pomocą -mindepth 1, na wypadek gdyby jeden z podkatalogów miał taką samą nazwę jak rodzic.
AFH,
@AFH Dobra sugestia! Zmodyfikowałem moją odpowiedź, aby dodać -mindepth 1jako kolejny potencjalny sposób uniknięcia spakowania katalogu nadrzędnego.
JakeGould,
1
Doceniam pomoc. Właściwie poszedłem z poleceniem podanym wczoraj i nieco zmodyfikowałem, aby było nieco prostsze. $ find * -maxdepth 1 -type d -exec zip -r {}.zip {} \;osiąga dokładnie to, czego chciałem, użyłem go w katalogach testowych, a także w moim na żywo, dla którego pierwotnie opublikowałem to pytanie.
Kefka,
@Matt Cudownie usłyszeć! Cieszę się, że to pomogło.
JakeGould,