Сбой команды 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 -
) начать следующую итерацию.