Сбой команды Bash при доступе ко всем подкаталогам

У меня есть структура каталогов, как это:

example/ace/actives_final.sdf.gz
example/ace/decoys_final.sdf.gz
example/aces/actives_final.sdf.gz
example/aces/decoys_final.sdf.gz

Я только хочу получить доступ к каждому подкаталогу и распаковать файлы... Я использовал

for D in `find . -maxdepth 1 -type d`; do gzip actives_final.sdf.gz; gzip -d decoys_final.sdf.gz; done

Кроме того, для части, я заменил всю часть с "для" на первый ";" с заданными строками:

  • for i in ./*;
  • for i in */;

Кажется, что все эти варианты работают для первого каталога, туза.

Затем я получаю ошибки

gzip: actives_final.sdf.gz: No such file or directory; 
gzip: decoys_final.sdf.gz: No such file or directory

три раза, что соответствует, как этот каталог включает, кроме ace, две скрытые директории и aces,

Но я несколько раз проверил орфографию в каталоге aces и gzip должен их найти, они такие же, как в ace,

Я новичок в bash и боюсь, что допустил очевидную ошибку...

Изменить: я использовал эту ограниченную структуру только в качестве теста, позже, в каждом каталоге будет больше.gz, но не все из них должны быть распакованы, поэтому я должен искать полное имя. Кроме того, если распаковка работает, я должен выполнить еще одну команду в этих подкаталогах, поэтому я должен использовать цикл for.

1 ответ

Решение

Вам не нужно forпетля здесь. find должно быть достаточно:

find -name "*.gz" -exec gunzip {} \;

В этой команде find рекурсивно ищет файлы, заканчивающиеся на .gz и извлекает их, используя gunzip в их местоположении.


Если вам нужен цикл, вы можете сделать следующее:

for dir in $(find . -maxdepth 1 -type d)
do
  echo "entering $dir"
  cd "$dir"
  gunzip actives_final.sdf.gz
  gunzip decoys_final.sdf.gz
  cd -
done

В этом цикле вы вводите каждый каталог (cd "$dir"), выполняя gunzip команды, а затем вернуться к предыдущему каталогу (cd -) начать следующую итерацию.

Другие вопросы по тегам