Is er een manier om alle bestanden in een bepaalde directory te zippen met het zip
commando? Ik “heb gehoord van het gebruik van *.*
, maar ik wil dat het ook werkt voor bestanden zonder extensie.
Opmerkingen
- Heb je geprobeerd een niveau omhoog te navigeren vanuit de gewenste directory en
zip myarch.zip mydir/*
te doen? - of beter
zip -r myarch.zip mydir/*
- of beter
zip -r myarch.zip mydir
-
*.*
betekent elk bestand met een punt. In cp / m en dos all bestanden hadden een punt, en je moest het typen (kon*
niet doen). Daarom kwamen mensen naar*.*
als alle bestanden. Uiteindelijk heeft Microsoft lange bestandsnamen toegevoegd die nul of meer punten kunnen hebben. Om een bestand met een punt in vensters te vinden, moet je*.*.*
typen.
Answer
Je kunt gewoon *
gebruiken; het is niet nodig voor *.*
. Bestandsextensies zijn niet speciaal op Unix. *
komt overeen met nul of meer kanalen tekens – inclusief een punt. Het komt dus overeen met foo.png
, omdat dat “nul of meer tekens zijn (zeven, om precies te zijn).
Merk op dat *
komt standaard niet overeen met bestanden die beginnen met een punt (evenmin als *.*
). Dit is vaak wat je wilt. Als dat niet het geval is, in bash, als je shopt -s dotglob
gebruikt, zal het (maar nog steeds .
en ..
). Andere shells hebben verschillende manieren (of helemaal geen) om dotfiles op te nemen.
Als alternatief heeft zip
ook een -r
(recursieve) optie om hele directorystructuren in één keer te maken (en je geen zorgen te hoeven maken over het dotfile-probleem):
zip -r myfiles.zip mydir
waarbij mydir
is de directory met uw bestanden. Merk op dat de geproduceerde zip zowel de directorystructuur als de bestanden zal bevatten. Zoals Peterph in zijn commentaar opmerkt, wordt dit meestal als een goede zaak gezien: door de zip uit te pakken, worden alle uitgepakte bestanden netjes in één submap opgeslagen.
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 die u vertelt over al zijn (vele) opties; typ man zip
om die documentatie te zien. Dit is niet “uniek voor zip; je kunt op deze manier documentatie krijgen voor de meeste commandos.
Opmerkingen
- Misschien wil je toevoegen dat het werd beschouwd als een goede gewoonte om alles in het archief op te nemen in een map op het hoogste niveau – zodat men ‘ zijn / haar huidige map bij het uitpakken niet vervuilt.
- @peterph gedaan. Hoewel dit minder gebruikelijk is in zip-bestanden dan in bijvoorbeeld tarfiles, ben ik ‘ bang.
- helaas wel. Waarschijnlijk vanwege de windows erfgoed van slepen ‘ n ‘ neerzetten op de desktop en Linux erfenis van het werken met broncodes.
- Binnenhouden denk eraan dat
*
shell-globbing ‘ geen dotfiles bevat (dwz bestandsnamen die beginnen met.
). Dit is een ander voordeel van het zippen van de hele directory op naam. - Maar het gebruik van -r omvat de directory zelf, die breekt wat ik ‘ ben bezig. Zou ‘ t *
.
en..
bevatten?
Antwoord
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
Reacties
- Daar ‘ Is er geen
mkv
hier? Ook is hier niets specifiekzsh
-specifiek. U ‘ zult elke variabele met een bestandsnaam correct willen citeren, duszip "${file%.*}.zip" "$file"
met de dubbele aanhalingstekens rond beide variabelen. - @tripleee Allereerst bedankt voor het wijzen op mijn foutieve verwijzing naar
mkv
. Ten tweede is het niet nodig om argumenten aan te halen inzsh
, in tegenstelling totbash
. Dat ‘ is waarom ik heb gespecificeerd dat dit een commando was voorzsh
. - De laatste puntkomma vervangen door een ampersand kan het aanzienlijk versnellen (als het aantal bestanden in de directory redelijk is …). Anders
find . -type f -maxdepth 1 -print0|xargs -r0 -n1 -P64 -I{} bash -c 'f="{}"; zip "${f%.*}.zip" "$f"'
(met-P
aangepast afhankelijk van je CPU-threads …) (Veel GNU-afhankelijkheden …) - om elk bestand in zijn eigen archief te zippen, doet u
gzip *
Antwoord
Een andere manier zou zijn om find en xargs te gebruiken: (dit kan een “.” directory in de zip bevatten, maar deze zou nog steeds correct moeten worden uitgepakt. Met mijn test verwijderde zip de punt ervoor compressie) find . -type f -exec zip zipfile.zip {} +
(De +
kan worden vervangen door \;
als uw versie van find
het +
einde voor exec niet ondersteunt. Het zal echter langzamer zijn …)
Dit omvat standaard alle submappen. Op GNU vind je -maxdepth
om dat te voorkomen.
Reacties
Answer
Een andere (langzame) methode om dit te doen (waarbij één bestand per keer aan de zip wordt toegevoegd):
for f in * .[^.]*; do [ -r "$f" ] || continue # Skip directories or non-existant files (Probably ".[^.]*" if directory has no dotfiles). Using -e will allow directories to be used as well zip zipfile.zip "$f" # If directories are included, you probably want to add -r done
Dit heeft de dotfile-problemen van *
(tijdelijke oplossing toegevoegd) en zou één keer start-zip zijn voor elk bestand, door het toe te voegen aan het archief. In bash
zou het omgaan met een groot aantal bestanden.
Het zou langzamer zijn dan de meeste andere methoden, maar is relatief eenvoudig.
Reacties
- Ik zou zeggen dat dit minder eenvoudig is dan het geaccepteerde antwoord, en langzamer, wat de vraag oproept: ” Waarom zou iemand dit doen? “. Als je die vraag kunt beantwoorden, raad ik je aan die context in je antwoord te plaatsen, anders denk ik dat het een slecht antwoord is op een oude vraag die al een goed antwoord heeft.
- @Centimane: ik let op de beperkingen . Ik denk dat dit educatieve waarde heeft. (Als u geen mappen overslaat, is het vrij eenvoudig). Als je in plaats daarvan een veel sneller antwoord wilt met een (standaard) externe tool, dan behandelt mijn andere antwoord dat. (met de afhandeling van dotfiles verwijderd (wat de juistheid beïnvloedt zonder hun afwezigheid vermeld in de vraag), vind ik het vrij elegant):
for f in *; do zip zip.zip "$f"; done
- Merk op dat de geaccepteerde answer gebruikt geen ‘ een extern commando en zou sneller zijn. In welk scenario zou dit antwoord nuttig zijn?
- @Centimane Met tar als er meer bestanden zijn dan wat bash als parameters kan doorgeven. (find + xargs zijn beter, want loops zijn gemakkelijker …). Het is een (uniek) antwoord op de vraag. Het is zeker niet het optimale antwoord. (Niet-optimale antwoorden kunnen nog steeds nuttig zijn voor vergelijkbare problemen, als iemand een iets andere situatie heeft – bijv. Als hij een tar-bestand wil of een map erin)
*
, dit omvat dotfiles en zal ‘ niet omvallen als er te veel bestanden in een directory staan)