Jag försöker zip en mapp i unix. Kan det göras med gzip-kommandot?
Kommentarer
Svar
Nej
Till skillnad från zip
fungerar gzip
som en kompressionsalgoritm endast .
På grund av olika anledningar, varav några lyssnar tillbaka på bandenhetstiden, använder Unix ett program med namnet tar
för att arkivera data, som sedan kan komprimeras med ett komprimeringsprogram som gzip
, bzip2
, 7zip
etc.
I för att ”zip” en katalog, skulle det rätta kommandot vara
tar -zcvf archive.tar.gz directory/
Detta säger tar
till
-
komprimera den med z (gzip) algoritm
-
c (skapa) ett arkiv från filerna i
directory
(tar
är rekursiv som standard) -
v (ordentligt) lista (on / dev / stderr så det påverkar inte piped-kommandon) alla filer som läggs till i arkivet.
-
och lagrar utdata som en f (fil) med namnet
archive.tar.gz
Kommandot tar
erbjuder gzip
support (via -z
-flaggan) enbart för din bekvämlighet . gzip
-kommandot / lib är helt separat. Kommandot ovan är i praktiken detsamma som
tar -cv directory | gzip > archive.tar.gz
För att dekomprimera och packa upp arkivet i den aktuella katalogen skulle du använda
tar -zxvf archive.tar.gz
Det kommandot är faktiskt detsamma som
gunzip < archive.tar.gz | tar -xv
tar
har många, många, många andra alternativ och användningsområden också; Jag rekommenderar varmt att läsa igenom manpage någon gång.
Kommentarer
- Bara för att göra sakerna ännu mer tydliga, detta är exakt likvärdigt med
tar -cv directory | gzip > archive.tar.gz
. Det resulterande arkivet kan sedan extraheras medtar -zxvf
eller till och medzcat file.tar.gz | tar -xv
. Poängen är att tjäran är helt oberoende av gzip, kommandottar
innehåller bara gzip-stöd för enkelhets skull. - Jag har använt
tar cvzf
ett tag. en sak att notera: om du använder Windows (7-zip
för att specificeras) för att packa upp en*.tar.gz
-fil tar det två omgångar. En för att packa upp*.tar.gz
-fil till en*.tar
-fil, den nästa som packar upp tarfilen till det ursprungliga innehållet. det ökar den totala uppladdningstiden, särskilt för stora filer (t.ex. loggar) - Påverkar namngivningen av arkivet något maskinmässigt? Jag vet att det skulle vara trevligt att låta folk veta algoritmen som ursprungligen användes för att zipa den (därmed .gz), men förutom det gör det faktiskt hur du heter arkivet?
- @hello_there_andy Det gör ingen skillnad för de flesta unixer, men windows (och fullbordande av smarta flikar i Linux) gör antaganden baserat på filnamnstillägg.
- @vadimkotov Det här kan vara vad du ’ letar efter: superuser.com/questions/168749/…
Svar
Kommandot gzip
komprimerar inte en katalog rekursivt till en enda zip-fil när du använder -r
växla. Snarare går den katalogstrukturen och zipar varje fil som den hittar i en separat fil.
Exempel
innan
$ tree dir1/ dir1/ |-- dir11 | |-- file11 | |-- file12 | `-- file13 |-- file1 |-- file2 `-- file3
kör nu gzip
kommando
$ gzip -r dir1
efter
$ tree dir1/ dir1/ |-- dir11 | |-- file11.gz | |-- file12.gz | `-- file13.gz |-- file1.gz |-- file2.gz `-- file3.gz
Om du föredrar att zipa upp katalogstrukturen vill du troligen använda kommandot tar
och sedan komprimera det resulterande .tar
-fil.
$ tar zcvf dir1.tar.gz dir1/
Exempel
$ tar zcvf dir1.tar.gz dir1/ dir1/ dir1/file1 dir1/file2 dir1/dir11/ dir1/dir11/file11.gz dir1/dir11/file12.gz dir1/dir11/file13.gz dir1/file3
Vilket resulterar i följande enskilda fil:
$ ls -l | grep tar -rw-rw-r-- 1 saml saml 271 Oct 1 08:07 dir1.tar.gz
Du kan bekräfta dess innehåll:
$ tar ztvf dir1.tar.gz drwxrwxr-x saml/saml 0 2013-10-01 08:05 dir1/ -rw-rw-r-- saml/saml 0 2013-10-01 07:45 dir1/file1 -rw-rw-r-- saml/saml 0 2013-10-01 07:45 dir1/file2 drwxrwxr-x saml/saml 0 2013-10-01 08:04 dir1/dir11/ -rw-rw-r-- saml/saml 27 2013-10-01 07:45 dir1/dir11/file11.gz -rw-rw-r-- saml/saml 27 2013-10-01 07:45 dir1/dir11/file12.gz -rw-rw-r-- saml/saml 27 2013-10-01 07:45 dir1/dir11/file13.gz -rw-rw-r-- saml/saml 0 2013-10-01 07:45 dir1/file3
Svar
Svaret på frågan ”Kan jag zip en hel mapp med gzip [på linux]?” är att du kan använda zip
-programmet istället för gzip med syntaxen:
zip -r <zip file name> <folder to zip>
Kommentarer
- @JeffSchaller: Detta är ett svar. Det är svårt fel (tror jag), men det är helt klart ett svar.
- @ize: Jag ’ Jag är ganska säker på att kommandot du publicerade inte gör det, använd faktiskt gzip.
- Poäng för att använda zip som frågan, troligtvis skulle författaren ha velat veta att ’ är möjligt att GÖRA EXAKT Samma sak som han brukade göra på windows. Det är tråkigt att de flesta inte vill ’ tänker så långt.
- Det är knepigt när frågan anger … ”använder gzip”.
- Jag ’ Jag röstar för det här svaret eftersom jag tror att produkten (en zip-fil) sannolikt är viktigare än metoden (med gzip).
Svar
Jag skriptade dessa två kommandon:
gzipdir
:
#!/bin/bash if [[ -d $1 ]]; then cd "$1" cd .. base=$(basename "$1") tar -zcvf "$base.tgz" "$base" if [[ $? == 0 && -f "$base.tgz" ]]; then rm -rf "$base" fi else echo "Usage: $0 DIRECTORY"; fi
ungzipdir
:
#!/bin/bash if [[ -f $1 ]]; then base=${1%%.*} file=$(basename "$1"); dir=$(basename "$base"); if [[ ! -d $base ]]; then mkdir "$base" cd "$base" cd .. tar -xvf "$file" if [[ $? == 0 && -d "$dir" ]]; then rm -f "$file" fi else echo "Directory $base already exists. Nothing done." fi else echo "Usage: $0 file.tgz"; fi
(!!!) Testa innan användning (eftersom det finns en ”rm -f” som potentiellt kan ta bort viktiga data om de används på ett ovanligt sätt).
Så här använder du:
cd /home/; gzipdir MyDirectory
eller gzipdir /home/MyDirectory
Skapar /home/MyDirectory.tgz och tar bort MyDirectory efter framgång (!!!).
ungzipdir /home/MyDirectory.tgz
Skapar / hem / MyDirectory och tar bort /home/MyDirectory.tgz vid framgång.
Kommentarer
- För att zippa upp alla filer i en katalog:
find ./* -maxdepth 0 -type d -exec gzipdir {} \;
(var försiktig med sökkommandot, testa det med-exec echo {}
först och se till att ’ inte fångar ’ ./’ som kommer att zippa upp PARENT-katalogen, eventuellt bryta hela ditt hem dir)
Svar
Jag rekommenderar att du använder pigz
( Parallell implementering av GZip )
tar -cvf - dir | pigz -9 > /path/to/dir.tar.gz
Kommentarer
- Jag använder det också mycket (och pixz), men fungerar det när rör och utgående omdirigering kommer till spel?
Svar
Om din linux tar inte stöder alternativet -z
Du kan använda följande:
tar -cvf - dir | gzip > dir.tar.gz
Svar
För fullständighet, om du vill tjära filen i baken kground, använd @Shadurs svar och lägg till &
till slut:
tar -zcvf archive.tar.gz directory/ &
gzip -r myfolder
som kommer att gzip filer rekursivt. På samma sätt kan du packa upp filer medgunzip -r myfolder
som packar upp filer rekursivt. För mer informationman gzip
tar
, det stöder alternativ för komprimering .gzip
är utformat som ett komplement tilltar
, inte som en ersättning.comment
eftersom det inte var svaret på hans fråga.1
och2
under mappplayground
.gzip -r ./playground
ger dig1.gz
och2.gz
(och inte mer1
och2
filer) under mappenplayground
, INTE en zippad fil med allt i den.