Ik probeer een map in unix te zippen. Kan dat worden gedaan met het gzip-commando?

Opmerkingen

  • je kunt gzip -r myfolder gebruiken om bestanden recursief te gzippen. Op dezelfde manier kun je bestanden uitpakken met gunzip -r myfolder die bestanden recursief zal unzippen. Voor meer informatie, man gzip
  • Gebruik tar; het ondersteunt opties voor compressie . gzip is ontworpen als aanvulling op tar, niet als vervanging.
  • Merk op dat @ val0x00ff ‘ s suggestie is vrijwel zeker niet wat je wilt bereiken.
  • @Shadur dat ‘ s waarom ik het plaatste als comment aangezien dat niet het antwoord op zijn vraag was.
  • Om te demonstreren wat @Shadur betekent. Gegeven bestanden 1 en 2 onder map playgroundgzip -r ./playground geeft je 1.gz en 2.gz (en niet meer 1 en 2 bestanden) in de map playground, NIET een gezipt bestand met alles erin.

Antwoord

Nee.

In tegenstelling tot zip, functioneert gzip als een compressie-algoritme alleen .

Om verschillende redenen, waarvan sommige teruggaan naar het tijdperk van tapedrives, gebruikt Unix een programma met de naam tar om gegevens te archiveren, die vervolgens kunnen worden gecomprimeerd met een compressieprogramma zoals gzip, bzip2, 7zip, enz.

In om een map te “zippen”, zou het juiste commando zijn

tar -zcvf archive.tar.gz directory/ 

Dit zal tar vertellen aan

  • comprimeer het met het z (gzip) algoritme

  • c (maak) een archief van de bestanden in directory (tar is standaard recursief)

  • v (uitgebreide) lijst (op / dev / stderr dus het heeft “geen invloed op doorgesluisde commandos) alle bestanden die het aan het archief toevoegt.

  • en sla de uitvoer op als een f (bestand) genaamd archive.tar.gz

Het tar commando biedt gzip ondersteuning (via de -z vlag) puur voor uw gemak . Het gzip commando / lib is volledig gescheiden. Het bovenstaande commando is in feite hetzelfde als

tar -cv directory | gzip > archive.tar.gz 

Om het archief te decomprimeren en uit te pakken in de huidige directory die je zou gebruiken

tar -zxvf archive.tar.gz 

Dat commando is in feite hetzelfde als

gunzip < archive.tar.gz | tar -xv 

tar heeft veel, vele, VEEL andere opties en toepassingen; Ik raad je van harte aan om de manpage eens door te lezen.

Reacties

  • Om de dingen nog explicieter te maken, dit is precies gelijk aan tar -cv directory | gzip > archive.tar.gz. Het resulterende archief kan vervolgens worden uitgepakt met tar -zxvf of zelfs zcat file.tar.gz | tar -xv. Het punt is dat de tar volledig onafhankelijk is van de gzip, de opdracht tar bevat alleen gzip-ondersteuning voor het gemak.
  • ik heb al een tijdje. één ding om op te merken: als u Windows (7-zip te specificeren) gebruikt om een *.tar.gz -bestand uit te pakken, duurt het twee rondes. Een om het *.tar.gz -bestand uit te pakken in een *.tar -bestand, de volgende om dat tar-bestand uit te pakken in de originele inhoud. het verlengt de totale uitpaktijd, vooral voor grote bestanden (bijv. logboeken)
  • Heeft de naamgeving van het archief invloed op iets machinaals? Ik weet dat het leuk zou zijn om mensen te laten weten welk algoritme oorspronkelijk werd gebruikt om het te zippen (vandaar .gz), maar afgezien daarvan maakt het eigenlijk uit hoe je het archief een naam geeft?
  • @hello_there_andy Het maakt nee verschil met de meeste unixen, maar windows (en slimme tabaanvulling in linux) zal aannames doen op basis van bestandsnaamextensie.
  • @vadimkotov Dit zou kunnen zijn wat je ‘ op zoek naar: superuser.com/questions/168749/…

Answer

Het gzip commando zal een map niet recursief comprimeren in een enkel zip-bestand, wanneer de -r schakelaar. Het zal eerder die directorystructuur doorlopen en elk gevonden bestand in een apart bestand zippen.

Voorbeeld

before

$ tree dir1/ dir1/ |-- dir11 | |-- file11 | |-- file12 | `-- file13 |-- file1 |-- file2 `-- file3 

voer nu de gzip commando

$ gzip -r dir1 

na

$ tree dir1/ dir1/ |-- dir11 | |-- file11.gz | |-- file12.gz | `-- file13.gz |-- file1.gz |-- file2.gz `-- file3.gz 

Als u “liever de directorystructuur wilt zipen, dan” wilt u waarschijnlijk de tar -opdracht gebruiken en de resulterende .tar bestand.

$ tar zcvf dir1.tar.gz dir1/ 

Voorbeeld

$ 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 

Wat resulteert in het volgende enkele bestand:

$ ls -l | grep tar -rw-rw-r-- 1 saml saml 271 Oct 1 08:07 dir1.tar.gz 

U kunt de inhoud ervan bevestigen:

$ 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 

Answer

Het antwoord op de vraag “Kan ik een hele map zippen met gzip [op linux]?” is dat je het zip programma kunt gebruiken in plaats van gzip, met de syntaxis:

zip -r <zip file name> <folder to zip> 

Reacties

  • @JeffSchaller: Dit is een antwoord. Het is een ernstig verkeerde (denk ik), maar het is duidelijk een antwoord.
  • @ize: ik ‘ ben er vrij zeker van dat het commando dat je hebt gepost dat niet doet, gebruik in feite gzip.
  • Punten voor het gebruik van zip zoals de gestelde vraag, hoogstwaarschijnlijk had de auteur het graag willen weten ‘ s mogelijk om HET EXACT TE DOEN HETZELFDE als hij vroeger deed op ramen. Het is triest dat de meeste mensen ‘ niet zo ver willen denken.
  • Het is lastig als de vraag specificeert … “gzip gebruiken”.
  • Ik ‘ stem in met dit antwoord omdat ik denk dat het product (een zipbestand) waarschijnlijk belangrijker is dan de methode (met gzip).

Answer

Ik heb deze 2 commandos gescript:

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 

(!!!) Test voor gebruik (aangezien er een “rm -f” is die mogelijk belangrijke gegevens kan verwijderen als deze op een ongebruikelijke manier wordt gebruikt).

Hoe te gebruiken:

cd /home/; gzipdir MyDirectory of gzipdir /home/MyDirectory

Zal /home/MyDirectory.tgz maken en MyDirectory verwijderen bij succes (!!!).

ungzipdir /home/MyDirectory.tgz

Zal / home / MyDirectory maken en /home/MyDirectory.tgz verwijderen bij succes.

Opmerkingen

  • Om ALLE bestanden in een directory te zipen: find ./* -maxdepth 0 -type d -exec gzipdir {} \; (wees voorzichtig met het find commando, test het met -exec echo {} en zorg ervoor dat u ‘ niet ‘ ./’ die de PARENT-directory zal dichtritsen, waardoor mogelijk uw hele startpagina wordt verbroken)

Answer

Ik raad aan om pigz ( Parallelle implementatie van GZip )

tar -cvf - dir | pigz -9 > /path/to/dir.tar.gz te gebruiken

Reacties

  • Ik gebruik het ook veel (en pixz), maar werkt het als pipes en output-omleiding een rol spelen?

Antwoord

Als je linux-tar de -z optie niet ondersteunt u kunt het volgende gebruiken:

tar -cvf - dir | gzip > dir.tar.gz 

Antwoord

Voor de volledigheid, als u wil je het bestand in de bac kground, gebruik het antwoord van @Shadur en voeg uiteindelijk & toe:

tar -zcvf archive.tar.gz directory/ & 

Geef een reactie

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