Как распаковать все .tar.gz с помощью шелл-скрипта?

Я пробовал это:

DIR=/path/tar/*.gz

if [ "$(ls -A $DIR 2> /dev/null)" == "" ]; then
  echo "not gz"
else
  tar -zxvf /path/tar/*.gz -C /path/tar
fi

Если в папке есть один tar, то работает. Если в папке много tar, я получаю сообщение об ошибке.

Как я могу это сделать?

У меня есть идея запустить цикл для распаковки, но я не знаю, как решить эту проблему.


person fifty arashi    schedule 24.11.2010    source источник


Ответы (4)


Я считаю синтаксис find exec очень полезным:

find . -name '*.tar.gz' -exec tar -xzvf {} \;

{} заменяется каждым найденным файлом, и строка выполняется.

person Joshua Martell    schedule 24.11.2010

for a in /path/tar/*.gz
do
    tar -xzvf "$a" -C /path/tar
done

Заметки

  • Это предполагает, что файлы, оканчивающиеся на .gz, представляют собой сжатые tar-файлы. Обычно .tgz или .tar.gz используются для обозначения этого, однако tar не работает, если что-то не так.
  • Возможно, вам будет проще сначала выполнить cd /path/tar, затем вы можете удалить -C /path/tar из команды untar и /path/tar/ в цикле.
person Matt Joiner    schedule 24.11.2010

Принятый ответ работал у меня с небольшой модификацией

for f in *.tar.gz
do
  tar zxvf "$f" -C \name_of_destination_folder_inside_current_path
done

Мне пришлось изменить косую черту на обратную косую черту, и тогда это сработало для меня.

person Shamsa    schedule 24.05.2018
comment
Я могу только предположить, что это обходной путь для Windows; это не дает существенно другого решения проблемы, как было задано. - person chepner; 22.07.2021
comment
@chepner Ты прав. Я работал на винде. - person Shamsa; 28.07.2021

person    schedule
comment
на тот случай, если вы хотите пропустить родительские каталоги code --strip-components=ЧИСЛО удалить ЧИСЛО ведущих компонентов из имен файлов при извлечении code - person Pavan Kumar N; 30.06.2015