Er det en måte å pakke alle filer i en gitt katalog med zip
-kommandoen? Jeg har hørt om å bruke *.*
, men jeg vil at den også skal fungere for utvidelsesløse filer.
Kommentarer
Svar
Du kan bare bruke *
, det er ikke noe behov for *.*
. Filutvidelser er ikke spesielle på Unix. *
samsvarer med null eller flere ch tegn – inkludert en prikk. Så det samsvarer med foo.png
, fordi det er null eller flere tegn (syv, for å være nøyaktig).
Merk at *
samsvarer som standard ikke med filer som begynner med en prikk (heller ikke *.*
). Dette er ofte det du vil ha. Hvis ikke, hvis du shopt -s dotglob
, vil det (men vil fortsatt utelukke .
og ..
). Andre skall har forskjellige måter (eller ingen i det hele tatt) å inkludere dotfiles.
Alternativt har zip
også en -r
(rekursivt) alternativ for å gjøre hele katalogtrær på en gang (og ikke trenger å bekymre deg for dotfile-problemet):
zip -r myfiles.zip mydir
der mydir
er katalogen som inneholder filene dine. Merk at den produserte zip vil inneholde katalogstrukturen så vel som filene. Som peterph påpeker i sin kommentar, blir dette vanligvis sett på som en god ting: å pakke ut zip vil lagre alle de utpakkede filene pent i en underkatalog.
Du kan også be zip om ikke å lagre banene med -j
/ --junk-paths
alternativet.
zip
kommandoen kommer med dokumentasjon som forteller deg om alle (mange) alternativene; skriv man zip
for å se dokumentasjonen. Dette er ikke unikt for zip. Du kan få dokumentasjon for de fleste kommandoer på denne måten.
Kommentarer
- Du vil kanskje legge til at det er anså som en god praksis å inneholde alt i arkivet i en toppkatalog – slik at man ikke ‘ ikke forurenser sin / den nåværende katalogen ved utvinning.
- @peterph ferdig. Selv om dette er mindre en konvensjon i zip-filer enn i for eksempel tarfiler, er jeg ‘ redd.
- dessverre ja. Sannsynligvis på grunn av vinduene arv fra dra ‘ n ‘ slipp til skrivebordet og linux arv med å jobbe med kildekoder.
- Hold inne husk at
*
shell-globbing ikke inkluderer ‘ t inkluderer dotfiles (dvs. filnavn som begynner med.
div Dette er en annen fordel ved å zippe hele katalogen etter navn. - Men å bruke -r inkluderer selve katalogen, som bryter det jeg ‘ gjør. Ville ‘ t * inkludere
.
og..
?
Svar
I mitt tilfelle ønsket jeg å zip hver fil i sitt eget arkiv, så jeg gjorde følgende (i zsh
):
$ for file in *; do zip ${file%.*}.zip $file; done
Kommentarer
- Der ‘ er nei
mkv
her? Ingenting her er heller ikke spesieltzsh
-spesifikt. Du ‘ vil sitere riktig hver variabel som inneholder et filnavn, såzip "${file%.*}.zip" "$file"
med doble anførselstegn rundt begge variablene. - @ tripleee For det første takk for at du påpekte min feilaktige henvisning til
mkv
. For det andre er sitering av argumenter unødvendig izsh
, i motsetning til ibash
. At ‘ er grunnen til at jeg spesifiserte at dette var en kommando forzsh
. - Erstatter den siste semikolon med et ampersand kan øke hastigheten betydelig (hvis antall filer i katalogen er rimelig …). Ellers
find . -type f -maxdepth 1 -print0|xargs -r0 -n1 -P64 -I{} bash -c 'f="{}"; zip "${f%.*}.zip" "$f"'
(med-P
justert avhengig av CPU-tråder …) (Mange GNU-avhengigheter …) - for å pakke hver fil i sitt eget arkiv, gjør
gzip *
Svar
En annen måte ville være å bruke find og xargs: (dette kan inkludere en «.» -katalog i zip, men den skal fortsatt trekkes ut riktig. Med testen min fjernet zip prikken før komprimering) find . -type f -exec zip zipfile.zip {} +
(+
kan erstattes med \;
hvis din versjon av find
ikke støtter +
slutt for eksekvering. Det vil være tregere skjønt …)
Dette inkluderer som standard alle underkataloger. På GNU kan -maxdepth
forhindre det.
Kommentarer
- (i motsetning til løsningene som bruker
*
, dette inkluderer dotfiles og vant ‘ t faller over hvis det er for mange filer i en katalog)
Svar
En annen (langsom) metode for å gjøre dette (som legger til en fil i zip om 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 dotfilutgavene av *
(løsning lagt til) og vil være start-zip en gang for hver fil, og legge den til i arkivet. I bash
vil det håndtere en stor mengde filer.
Det ville være tregere enn de fleste andre metoder, men er relativt enkelt.
Kommentarer
- Jeg vil si dette er mindre enkelt enn det aksepterte svaret, og tregere, noe som ber spørsmålet: » Hvorfor ville noen gjøre dette? «. Hvis du kan svare på det spørsmålet, anbefaler jeg at du setter den sammenhengen i svaret ditt, ellers synes jeg det er et dårlig svar på et gammelt spørsmål som allerede har et godt svar.
- @Centimane: Jeg bemerker begrensningene . Jeg føler dette har pedagogisk verdi. (Hvis du ikke hopper over kataloger, er det ganske enkelt). Hvis du vil ha et mye raskere svar ved hjelp av et (standard) eksternt verktøy i stedet, dekker mitt andre svar det. (med dotfiles-håndteringen fjernet (som påvirker korrektheten uten deres fravær nevnt i spørsmålet), føler jeg det er ganske elegant):
for f in *; do zip zip.zip "$f"; done
- Merk at det aksepterte svaret ‘ t bruker en ekstern kommando og vil være raskere. I hvilket scenario ville dette svaret være nyttig?
- @Centimane Med tjære når det er flere filer enn hva bash kan passere som parametere. (finn + xargs er bedre, for løkker er lettere …). Det er et (unikt) svar på spørsmålet. Det er absolutt ikke det optimale svaret. (Ikke optimale svar kan fremdeles være nyttige for lignende problemer, hvis noen har en litt annen situasjon – f.eks. Ønsker tar-filer noen kataloger i den)
zip myarch.zip mydir/*
?zip -r myarch.zip mydir/*
zip -r myarch.zip mydir
*.*
betyr hvilken som helst fil med en prikk. cp / m og dos alle filene hadde en prikk, og det fikk deg til å skrive det (kunne ikke gjøre*
). Derfor kom folk til å se*.*
som alle filer. Til slutt la Microsoft til lange filnavn som kan ha null eller flere prikker. For å finne en fil som har en prikk på windows, må du skrive*.*.*
.