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 specifiek zsh -specifiek. U ‘ zult elke variabele met een bestandsnaam correct willen citeren, dus zip "${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 in zsh, in tegenstelling tot bash. Dat ‘ is waarom ik heb gespecificeerd dat dit een commando was voor zsh.
  • 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

  • (in tegenstelling tot de oplossingen die *, dit omvat dotfiles en zal ‘ niet omvallen als er te veel bestanden in een directory staan)

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)

Geef een reactie

Het e-mailadres wordt niet gepubliceerd. Vereiste velden zijn gemarkeerd met *