Если ваш вариант tar
поддержки --one-top-level
:
find . -name "*.tar.gz" -execdir tar --one-top-level -xvzf {} \;
От man 1 tar
:
--one-top-level[=DIR]
Извлеките все файлы в DIR
или, если используется без аргументов, в подкаталог, названный базовым именем архива (за исключением стандартных суффиксов сжатия, распознаваемых по --auto-compress
).
Примечание: {}
может заключаться в кавычки или не заключаться в них, но их *.tar.gz
следует заключать в кавычки, чтобы избежать подобных ошибок: find
утилита не выводит все файлы при использовании подстановочных знаков .
Если ваш вариант tar
не поддерживает, --one-top-level
то -C
это хорошая идея, вам просто нужно сначала создать соответствующий каталог. Эта команда, однако, идет дальше и даже не использует -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 {} \;
Единственный не POSIX компонент здесь - это tar
сам. tar
это только признан устаревшим инструментом без поддержки GZIP. В POSIX (с 2001 года) эквивалентом tar
является pax
программа, также без поддержки gzip. Насколько я знаю, gzip
в POSIX нет (и нет эквивалента), поэтому невозможно создать решение, полностью соответствующее формальному стандарту POSIX.
К счастью gzip
, это стандарт де-факто . В худшем случае приведенный выше фрагмент кода должен выполняться gzip
перед tar
(или pax
).