У меня есть такая структура каталогов:
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.
Вам не нужно 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 -
) для запуска следующего повторения.