Er der en måde at zip alle filer i en given mappe med kommandoen zip? Jeg har hørt om at bruge *.*, men jeg vil også have det til at fungere for filer uden filendelse.

Kommentarer

  • Har du prøvet at navigere et niveau op fra det ønskede bibliotek og gøre zip myarch.zip mydir/*?
  • eller bedre zip -r myarch.zip mydir/*
  • eller bedre zip -r myarch.zip mydir
  • *.* betyder enhver fil med en prik. I cp / m og dos alle filer havde en prik, og det fik dig til at skrive det (kunne ikke gøre *). Derfor kom folk til at se *.* som alle filer. Til sidst tilføjede Microsoft lange filnavne, der kunne have nul eller flere prikker. For at finde en fil, der har en prik på windows, skal du skrive *.*.*.

Svar

Du kan bare bruge *; der er ikke behov til *.*. Filudvidelser er ikke specielle på Unix. * matcher nul eller flere ch tegn – inklusive en prik. Så det matcher foo.png, fordi det er nul eller flere tegn (syv, for at være nøjagtigt).

Bemærk at * matcher som standard ikke filer, der begynder med en prik (heller ikke *.*). Dette er ofte hvad du vil have. Hvis ikke, i bash, hvis du shopt -s dotglob vil det (men vil stadig udelukke . og ..). Andre skaller har forskellige måder (eller slet ingen) på at inkludere dotfiles.

Alternativt har zip også en -r (rekursiv) mulighed for at udføre hele katalogtræer på én gang (og ikke behøver at bekymre sig om dotfile-problemet):

zip -r myfiles.zip mydir 

hvor mydir er den mappe, der indeholder dine filer. Bemærk, at den producerede zip indeholder katalogstrukturen såvel som filerne. Som peterph påpeger i sin kommentar, ses dette normalt som en god ting: udpakning af zip gemmer pænt alle de udpakkede filer i en underkatalog.

Du kan også bede zip om ikke at gemme stierne med -j / --junk-paths option.

Kommandoen zip kommer med dokumentation, der fortæller dig om alle dens (mange) muligheder; skriv man zip for at se denne dokumentation. Dette er ikke unikt for zip; du kan få dokumentation for de fleste kommandoer på denne måde.

Kommentarer

  • Du vil måske tilføje, at det er betragtes som en god praksis at indeholde alt i arkivet i et topniveau-bibliotek – så man ikke ‘ ikke forurener hans / hendes nuværende bibliotek ved udvinding.
  • @peterph færdig. Selvom dette er mindre en konvention i zip-filer end f.eks. tarfiler, er jeg ‘ bange.
  • desværre ja. Sandsynligvis på grund af vinduerne arv fra træk ‘ n ‘ slip til skrivebordet og linux arv ved at arbejde med kildekoder.
  • Hold i husk at * shell-globbing ikke ‘ t inkluderer dotfiles (dvs. filnavne der begynder med .). Dette er en anden fordel ved at zippe hele biblioteket ved navn.
  • Men brug af -r inkluderer selve kataloget, som bryder det, jeg ‘ laver. Ville ‘ t * medtage . og ..?

Svar

I mit tilfælde ville jeg zip hver fil i sit eget arkiv, så jeg gjorde følgende (i zsh):

$ for file in *; do zip ${file%.*}.zip $file; done 

Kommentarer

  • Der ‘ nej mkv her? Intet her er heller ikke specielt zsh -specifikt. Du ‘ vil citere alle variabler, der indeholder et filnavn, korrekt, så zip "${file%.*}.zip" "$file" med de dobbelte anførselstegn omkring begge variabler.
  • @ tripleee For det første tak, fordi du påpegede min fejlagtige henvisning til mkv. For det andet er det ikke nødvendigt at citere argumenter i zsh, i modsætning til i bash. At ‘ hvorfor jeg specificerede, at dette var en kommando til zsh.
  • Udskiftning af den sidste semikolon med et ampersand kan fremskynde det betydeligt (hvis antallet af filer i biblioteket er rimeligt …). Ellers find . -type f -maxdepth 1 -print0|xargs -r0 -n1 -P64 -I{} bash -c 'f="{}"; zip "${f%.*}.zip" "$f"' (med -P justeret afhængigt af dine CPU-tråde …) (Mange GNU-afhængigheder …)
  • for at zip hver fil i sit eget arkiv skal du gzip *

Svar

En anden måde ville være at bruge find og xargs: (dette kan omfatte en “.” -mappe i zipen, men den skal stadig udtrækkes korrekt. Med min test fjernede zip prikken før komprimering) find . -type f -exec zip zipfile.zip {} +

(+ kan erstattes med \; hvis din version af find ikke understøtter + til eksekvering. Det vil dog være langsommere …)

Dette inkluderer som standard alle underkataloger. På GNU kan -maxdepth forhindre det.

Kommentarer

  • (i modsætning til de løsninger, der bruger *, dette inkluderer dotfiles og vandt ‘ t vælter, hvis der er for mange filer i en mappe)

Svar

En anden (langsom) metode til at gøre dette (som tilføjer en fil til zip ad gangen):

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 

Dette har dotfile-udgaverne af * (løsning tilføjet) og vil være start-zip en gang for hver fil og føje den til arkivet. I bash ville det håndtere en stor mængde filer.

Det ville være langsommere end de fleste andre metoder, men det er relativt simpelt.

Kommentarer

  • Jeg vil sige, at dette er mindre simpelt end det accepterede svar og langsommere, hvilket beder om spørgsmålet: ” Hvorfor ville nogen gøre dette? “. Hvis du kan besvare dette spørgsmål, anbefaler jeg, at du sætter denne sammenhæng i dit svar, ellers synes jeg, det er et dårligt svar på et gammelt spørgsmål, der allerede har et godt svar.
  • @Centimane: Jeg bemærker begrænsningerne . Jeg føler, dette har uddannelsesmæssig værdi. (Hvis du ikke springer over mapper, er det ret simpelt). Hvis du ønsker et meget hurtigere svar ved hjælp af et (standard) eksternt værktøj i stedet, dækker mit andet svar det. (med fjernelse af dotfiles-håndtering (hvilket påvirker korrekthed uden deres fravær nævnt i spørgsmålet), føler jeg det er ret elegant): for f in *; do zip zip.zip "$f"; done
  • Bemærk, at den accepterede svaret ‘ bruger ikke en ekstern kommando og ville være hurtigere. I hvilket scenario ville dette svar være nyttigt?
  • @Centimane Med tjære, når der er flere filer, end hvad bash kan overføre som parametre. (find + xargs er bedre, for sløjfer er lettere …). Det er et (unikt) svar på spørgsmålet. Det er bestemt ikke det optimale svar. (Ikke optimale svar kan stadig være nyttige til lignende problemer, hvis nogen har en lidt anden situation – f.eks. Ønsker tar-fil nogen kataloger i den)

Skriv et svar

Din e-mailadresse vil ikke blive publiceret. Krævede felter er markeret med *