Is er een manier om alle bestanden in een gegeven map te zippen met het zip
commando? Ik heb gehoord van het gebruik van *.*
, maar ik wil dat het ook werkt voor bestanden zonder extensie.
U kunt gewoon *
gebruiken; er is geen noodzaak voor *.*
. Bestandsextensies zijn niet speciaal op Unix. *
komt overeen met nul of meer tekens, inclusief een punt. Dus het komt overeen met foo.png
, want dat'is nul of meer karakters (zeven, om precies te zijn).
Merk op dat *
standaard niet overeenkomt met bestanden die met een punt beginnen (en *.*
ook niet). Dit is vaak wat je wilt. Zo niet, in bash, als je shopt -s dotglob
doet het dat wel (maar zal nog steeds .
en ..
uitsluiten). Andere shells hebben andere manieren (of helemaal geen) om dotfiles op te nemen.
Als alternatief heeft zip
ook een -r
(recursief) optie om hele mappen in een keer te doen (en je geen zorgen te hoeven maken over het dotfile probleem):
zip -r myfiles.zip mydir
waarbij mydir
de directory is die uw bestanden bevat. Merk op dat de geproduceerde zip zowel de directory structuur als de bestanden zal bevatten. Zoals peterph in zijn commentaar aangeeft, wordt dit meestal als een goede zaak gezien: het uitpakken van de zip zal alle uitgepakte bestanden netjes in één subdirectory opslaan.
Je kunt zip ook vertellen om de paden niet op te slaan met de -j
/--junk-paths
optie.
Het zip
commando wordt geleverd met documentatie over alle (vele) opties; type man zip
om die documentatie te zien. Dit is niet uniek voor zip; je kunt documentatie voor de meeste commando's op deze manier krijgen.
In mijn geval wilde ik elk bestand in zijn eigen archief zippen, dus deed ik het volgende (in zsh
):
$ for file in *; do zip ${file%.*}.zip $file; done
Een andere manier zou zijn om find en xargs: te gebruiken (dit zou een "." directory in de zip kunnen bevatten, maar het zou nog steeds correct moeten uitpakken. Bij mijn test, heeft zip de punt gestript voor het comprimeren)
find . -type f -exec zip zipfile.zip {} +
(De +
kan vervangen worden door als jouw versie van
findhet
+` einde voor exec niet ondersteunt. Het zal wel trager zijn...)
Dit zal standaard alle subdirectories bevatten. Op GNU find kan -maxdepth
dat voorkomen.