Zipa alla filer i katalogen?

Finns det ett sätt att komprimera alla filer i en viss katalog med kommandot zip? Jag har hört talas om att använda *.*, men jag vill att det ska fungera även för filer utan tillägg.

Lösning

Du kan bara använda *; det finns inget behov av *.*. Filtillägg är inte speciella på Unix. * matchar noll eller flera tecken - inklusive en punkt. Det matchar alltså foo.png, eftersom det är noll eller fler tecken (sju, för att vara exakt).

Observera att * som standard inte matchar filer som börjar med en punkt (inte heller *.*). Detta är ofta vad du vill ha. Om inte, i bash, om du shopt -s dotglob gör det (men utesluter fortfarande . och ..). Andra skal har andra sätt (eller inget alls) att inkludera dotfiles.

Alternativt har zip också ett -r (rekursivt) alternativ för att göra hela katalogträd på en gång (och inte behöva oroa sig för dotfileproblemet):

zip -r myfiles.zip mydir

där mydir är den katalog som innehåller dina filer. Observera att den producerade zip-filen kommer att innehålla både katalogstrukturen och filerna. Som peterph påpekar i sin kommentar ses detta vanligtvis som en bra sak: genom att extrahera zip-filen kommer alla extraherade filer att lagras snyggt i en underkatalog.

Du kan också be zip att inte lagra sökvägarna med alternativet -j/--junk-paths.

Kommandot zip kommer med dokumentation som berättar om alla dess (många) alternativ; skriv man zip för att se den dokumentationen. Detta är inte unikt för zip; du kan få dokumentation för de flesta kommandon på detta sätt.

Kommentarer (16)

I mitt fall ville jag packa varje fil till ett eget arkiv, så jag gjorde följande (i zsh):

$ for file in *; do zip ${file%.*}.zip $file; done
Kommentarer (3)

Ett annat sätt är att använda find och xargs: (detta kan inkludera en "."-katalog i zip-filen, men den bör ändå extraheras korrekt. I mitt test tog zip bort pricken före komprimering) find . -type f -exec zip zipfile.zip {} +

(+ kan ersättas med \; om din version av find inte har stöd för + i slutet för exec. Det kommer dock att vara långsammare...)

Detta kommer som standard att inkludera alla underkataloger. På GNU find kan -maxdepth förhindra detta.

Kommentarer (1)