Jag försöker zip en mapp i unix. Kan det göras med gzip-kommandot?

Kommentarer

  • du kan använda gzip -r myfolder som kommer att gzip filer rekursivt. På samma sätt kan du packa upp filer med gunzip -r myfolder som packar upp filer rekursivt. För mer information man gzip
  • Använd tar, det stöder alternativ för komprimering . gzip är utformat som ett komplement till tar, inte som en ersättning.
  • Observera att @ val0x00ff ’ s förslag är nästan säkert inte vad du vill åstadkomma.
  • @Shadur att ’ varför jag publicerade det som comment eftersom det inte var svaret på hans fråga.
  • För att demostrera vad @Shadur betyder. Angivna filer 1 och 2 under mapp playground . gzip -r ./playground ger dig 1.gz och 2.gz (och inte mer 1 och 2 filer) under mappen playground, INTE en zippad fil med allt i den.

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 med tar -zxvf eller till och med zcat file.tar.gz | tar -xv. Poängen är att tjäran är helt oberoende av gzip, kommandot tar 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/ & 

Lämna ett svar

Din e-postadress kommer inte publiceras. Obligatoriska fält är märkta *