访问所有子目录的 Bash 命令失败

访问所有子目录的 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 部分,我将从“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 -)开始下一次迭代。

相关内容