Извлеките файлы .tar.gz в разных подкаталогах.

467
m4D_guY

У меня есть фенологические данные о разных породах деревьев, но они сохраняются большей группой деревьев.

Вывод find . -name *.tar.gz:

./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 

Я хочу извлечь каждый файл в их подкаталог, и имя выходного каталога должно совпадать с tar-файлом.

Мне удается извлечь все с помощью find . -name *.tar.gz -execdir tar -xvzf "{}" \;Но это не создает имя каталога после заархивированных файлов.

Как мне это сделать? -Cнужен каталог, который уже существует ...

Итак, в конце я хотел бы иметь

Tilia/EP725_DE_129_070/content_of_PEP725_DE_129_070.tar.gz 

и так далее...

0
Примечание: указывайте правильно, `-name" * .tar.gz "`. Сравнить [утилита `find` не выводит все файлы при использовании подстановочных знаков] (https://superuser.com/q/1217773/432690). Вы можете сбежать пару раз, но это в конце концов ударит вас. Kamil Maciorowski 5 лет назад 0

2 ответа на вопрос

0
xenoid

Что-то вроде:

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  

Не проверено, используйте на свой страх и риск.

Скопируйте выше в файл и sourceфайл.

Если вы чувствуете себя авантюрным, вы также можете сделать это одной строкой.

Пока дикая вишня (или другое имя с пробелом в нем) не появляется ... Kamil Maciorowski 5 лет назад 0
0
Kamil Maciorowski

Если ваш вариант 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).

Спасибо, это сработало. Что означает POSIX? m4D_guY 5 лет назад 0
@ m4D_guY [Портативный интерфейс операционной системы] (https://en.wikipedia.org/wiki/POSIX). Решение, полностью совместимое с POSIX, будет работать на различных системах. В целом, существует множество инструментов (или опций), которые поддерживаются только в «больших» Linux. Если вы можете использовать их, отлично! Но если вы работаете со встроенным «минимальным» Unix или на Mac (где инструменты часто отличаются от инструментов Linux) и т. Д., То решение, которое не выходит за рамки POSIX, может стать спасением. Kamil Maciorowski 5 лет назад 0

Похожие вопросы