Entpacken Sie Unterordner mit dem Inhalt des Anfangsordners unter Linux

7

Ich habe ein Verzeichnis, /Landsat_Data/welche Verzeichnisse enthält ( Landsat_Data/Site1, Landsat_Data/Site2usw.). Jedes Unterverzeichnis enthält .tar.gzDateien (z. B. /Landsat_Data/Site2/LE70930862008092-SC20160107074735.tar.gzusw.) und jede .tar.gzDatei enthält TIF- oder XML-Dateien wie thisL

-rw-r--r-- espa/ie  29952 2016-01-07 14:57 LT50930861991021ASA00_sr_snow_qa.tif 

Ich möchte jede TAR-Datei in ein eigenes Unterverzeichnis entpacken (z Landsat_Data/Site2/LE70930862008092-SC20160107074735/. B. ).

Bisher verwende ich diese Befehlszeile als Landsat_Data-Verzeichnisse:

find . -type f -name "*.tar.gz" -execdir tar -xvzf {} \;

Dieser Befehl extrahiert jedoch alle tif- und xml-Dateien in jedes Unterverzeichnis (z. B. Landsat_Data/Site2), während ich nur das entpacken möchte LE70930862008092-SC20160107074735.tar.gz, um ein Unterverzeichnis namens zu haben, LE70930862008092-SC20160107074735das alle tif- und xml-Dateien enthält. Irgendeine Idee, wie ich erreichen kann, was ich will?

SimonB
quelle
Könnten wir ein Beispiel tar -tvfeiner TAR-Datei sehen? Es scheint auch, dass Ihr Unterordner eine weitere Ordnerstruktur hat. Können wir auch ein Beispiel dafür sehen?
Zachary Brady
Wenn Sie "tar-Ordner" sagen, meinen Sie "tar- Datei ", richtig? Oh, und in der * nix-Welt haben wir keine Ordner, wir haben "Verzeichnisse" :)
terdon
@Zachary -rw-r - r-- espa / ie 59416 2016-01-07 14:57 LT50930861991021ASA00_sr_band5.tif -rw-r - r-- espa / ie 29952 2016-01-07 14:57 LT50930861991021ASA00_toa_band6_qa.tif
SimonB
Willkommen bei Unix & Linux! Bitte bearbeiten Sie Ihre Frage, um zusätzliche Informationen hinzuzufügen. Es ist schwer zu lesen und in den Kommentaren leicht zu übersehen. Kommentare können auch ohne Warnung gelöscht werden.
Terdon
@terdon Ich habe Tar-Verzeichnisse, die verschiedene TIF-Dateien enthalten, wie in früheren Kommentaren gezeigt. Sie möchten nur die Verzeichnisse entpacken, während die Dateien in den Verzeichnissen verbleiben. Hoffe es ist klar.
SimonB

Antworten:

5

Versuchen

find . -type f -name "*.tar.gz" -execdir tar -xvzf {} \;

gemäß man find

-execdir Befehl;

-execdir Befehl {} +

Wie -exec, aber der angegebene Befehl wird aus dem Unterverzeichnis ausgeführt, das die übereinstimmende Datei enthält. Dies ist normalerweise nicht das Verzeichnis, in dem Sie mit der Suche begonnen haben.

Archemar
quelle
Vielen Dank. Dies extrahiert jedoch die Dateien, die im tar-Ordner enthalten sind, aber ich möchte nur den tar-Ordner entpacken, während die Dateien in den untar-Ordnern verbleiben. Irgendeine Ahnung, wie es geht?
SimonB
@SimonB können Sie Ihren Beitrag bearbeiten 1) mit dem Inhalt des ursprünglichen Ordners 2) beabsichtigte extrahierte Datei?
Archemar
2

Hier ist eine Möglichkeit (dies setzt voraus, dass Sie Bash verwenden):

$ shopt -s globstar   
$ for tar in /Landsat_Data/**/*.tar.gz; do 
   tar xvzf "$tar" --one-top-level="$(dirname "$tar")"/"$(basename "$tar" .tar.gz)"
  done

Mit dieser globstarOption werden **0 oder mehr Dateien und Verzeichnisse rekursiv abgeglichen, sodass /Landsat_Data/**/*.tar.gzalle *tar.gzDateien in einem beliebigen Unterverzeichnis von übereinstimmen /Landsat_Data/. Der dirnameBefehl gibt den Verzeichnisnamen seiner Eingabe und basenamenur den Namen mit der von Ihnen angegebenen Erweiterung aus (hier tar.gzentfernt. So zum Beispiel:

$ dirname /Landsat_Data/Site2/LE70930862008092-SC20160107074735.tar.gz
/Landsat_Data/Site2
$ basename /Landsat_Data/Site2/LE70930862008092-SC20160107074735.tar.gz .tar.gz
LE70930862008092-SC20160107074735

Das --one-top-levelwird erklärt in man tar:

   --one-top-level[=DIR]
          Extract all files into DIR, or, if used without argument, into a
          subdirectory  named by the base name of the archive (minus stan‐
          dard compression suffixes recognizable by --auto-compress).

Zusammengenommen wird dies tun, was Sie wollen.


Wenn Sie tardiese Option nicht haben, können Sie dies manuell tun:

$ shopt -s globstar   
$ for tar in /Landsat_Data/**/*.tar.gz; do 
    newdir="$(dirname "$tar")"/"$(basename "$tar" .tar.gz)"
    mkdir "$newdir"
    tar xvzf "$tar" -C "$newdir"
  done 
terdon
quelle
Danke Terdon. Ich habe jedoch eine Fehlermeldung. 'nicht erkannte Option' --one-top-level = / Landsat_Data / ** / * '
SimonB
@ SimonB Welches Betriebssystem verwenden Sie?
Terdon
Ich bin unter Linux OS
SimonB
@ SimonB seltsam, vielleicht hast du eine ältere tarVersion. Wie auch immer, siehe aktualisierte Antwort.
Terdon