我有一个这样的目录结构:
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 部分,我将从“for”到第一个“;”的整个部分替换为给定的行:
for i in ./*;
for i in */;
所有这些变化似乎都适用于第一个目录,ace。
然后,我得到了错误
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
这里不需要-loop。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 -
)开始下一次迭代。