Extrahieren Sie .tar.gz-Dateien in verschiedenen Unterverzeichnissen

651
m4D_guY

Ich habe phänologische Daten von verschiedenen Baumarten, aber sie werden von der größeren Baumgruppe gespeichert.

Die Ausgabe von find . -name *.tar.gzist:

./Tilia/PEP725_DE_129_070.tar.gz ./Tilia/PEP725_DE_129_071.tar.gz ./Fagus/PEP725_DE_108_010.tar.gz ./Acer/PEP725_DE_115_000.tar.gz ./Acer/PEP725_DE_115_030.tar.gz ./Betula/PEP725_DE_106_020.tar.gz 

Ich möchte jede Datei in ihrem Unterverzeichnis extrahieren und der Name des Ausgabeverzeichnisses sollte mit der tar-Datei identisch sein.

Ich schaffe es, alles mit zu extrahieren. find . -name *.tar.gz -execdir tar -xvzf "{}" \;Dies erstellt jedoch keinen Verzeichnisnamen nach den gezippten Dateien.

Wie mache ich das? -Cmuss das Verzeichnis schon vorhanden sein ...

Am Ende möchte ich also haben

Tilia/EP725_DE_129_070/content_of_PEP725_DE_129_070.tar.gz 

und so weiter...

0
Hinweis: Zitieren Sie richtig, `-name" * .tar.gz "`. Das Compare-Dienstprogramm [`find] gibt bei Verwendung von Platzhaltern nicht alle Dateien aus.] (Https://superuser.com/q/1217773/432690). Sie können ein paar Mal wegkommen, aber es wird Sie schließlich treffen. Kamil Maciorowski vor 5 Jahren 0

2 Antworten auf die Frage

0
xenoid

So etwas wie:

for f in $(find . -name *.tar.gz);  do  cd $(dirname $d) # to ./Tilia/ d=$(basename $f .tar.gz)  mkdir $d # ./Tilia/PEP725_DE_129_070 cd $d # To ./Tilia/PEP725_DE_129_070 tar -xvzf ../$d.tar.gz # extracting ./Tilia/PEP725_DE_129_070.tar.gz in ./Tilia/PEP725_DE_129_070 cd ../.. # back to top done  

Nicht getestet, Verwendung auf eigene Gefahr.

Kopieren Sie oben in eine Datei und sourcedie Datei.

Wenn Sie abenteuerlustig sind, können Sie das auch zu einem One-Liner machen.

Bis Wildkirsche (oder ein anderer Name mit Leerzeichen) auftaucht… Kamil Maciorowski vor 5 Jahren 0
0
Kamil Maciorowski

Wenn Ihre Option tarunterstützt --one-top-level:

find . -name "*.tar.gz" -execdir tar --one-top-level -xvzf {} \; 

Von man 1 tar:

--one-top-level[=DIR]

Extrahieren Sie alle Dateien in DIRein Unterverzeichnis oder, wenn es ohne Argument verwendet wird, in ein Unterverzeichnis, das durch den Basisnamen des Archivs benannt wird (abzüglich Standard-Kompressionssuffixe, die durch erkannt werden können --auto-compress).

Hinweis: {}Kann in Anführungszeichen gesetzt *.tar.gz werden oder nicht, sollte jedoch in Anführungszeichen gesetzt werden, um Unfälle wie findfolgt zu vermeiden: Das Dienstprogramm gibt bei Verwendung von Platzhaltern nicht alle Dateien aus .


Wenn Ihre Option tarnicht unterstützt --one-top-levelwird, -Cist es eine gute Idee, Sie müssen nur ein entsprechendes Verzeichnis erstellen. Dieser Befehl geht jedoch noch einen Schritt weiter und verwendet nicht einmal -C:

find . -type f -name "*.tar.gz" -execdir sh -c ' dirn="$" # desired directory name mkdir -- "$dirn" # creating a directory cd -- "$dirn" && tar -xvzf ../"$1" # extracting to it ' find-sh {} \; 

Die einzige Nicht-POSIX-Komponente ist hier… die tarselbst. tarwird nur als Legacy-Tool ohne gzip-Unterstützung erkannt . In POSIX (seit 2001) entspricht tardas paxProgramm auch ohne gzip-Unterstützung. Soweit ich weiß, gibt es gzipin POSIX kein (oder gleichwertiges). Daher ist es unmöglich, eine Lösung zu erstellen, die dem formalen POSIX-Standard entspricht.

Zum Glück gzipist dies ein De-facto- Standard. Im schlimmsten Fall sollte der obige Code gzipvor tar(oder pax) ausgeführt werden.

Danke, es hat funktioniert. Was bedeutet POSIX? m4D_guY vor 5 Jahren 0
@ m4D_guY [Schnittstelle für tragbare Betriebssysteme] (https://en.wikipedia.org/wiki/POSIX). Eine vollständig POSIX-kompatible Lösung funktioniert auf verschiedenen Systemen. Im Allgemeinen werden viele Tools (oder Optionen) nur von "großen" Linuxen unterstützt. Wenn du sie benutzen kannst, großartig! Wenn Sie jedoch mit einem eingebetteten "minimalen" Unix oder auf einem Mac (auf dem sich Werkzeuge häufig von Linux unterscheiden) usw. arbeiten, kann eine Lösung, die nicht über POSIX hinausgeht, ein Lebensretter sein. Kamil Maciorowski vor 5 Jahren 0