Wenn Ihre Option tar
unterstü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 DIR
ein 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 find
folgt zu vermeiden: Das Dienstprogramm gibt bei Verwendung von Platzhaltern nicht alle Dateien aus .
Wenn Ihre Option tar
nicht unterstützt --one-top-level
wird, -C
ist 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 tar
selbst. tar
wird nur als Legacy-Tool ohne gzip-Unterstützung erkannt . In POSIX (seit 2001) entspricht tar
das pax
Programm auch ohne gzip-Unterstützung. Soweit ich weiß, gibt es gzip
in POSIX kein (oder gleichwertiges). Daher ist es unmöglich, eine Lösung zu erstellen, die dem formalen POSIX-Standard entspricht.
Zum Glück gzip
ist dies ein De-facto- Standard. Im schlimmsten Fall sollte der obige Code gzip
vor tar
(oder pax
) ausgeführt werden.