【发布时间】:2020-07-23 16:49:21
【问题描述】:
不幸的是,我是 bash 的新手,我想编写一个从主目录开始的脚本,并一一检查所有子目录是否存在某些文件,如果存在这些文件,请执行对它们进行操作。目前,我已经编写了一个简化版本来测试我是否可以完成第一部分(检查每个目录中的文件)。该代码运行时没有任何我可以判断的错误,但它没有回显任何内容表明它已成功找到我知道的文件。
#!/bin/bash
runlist=(1 2 3 4 5 6 7 8 9)
for f in *; do
if [[ -d {$f} ]]; then
#if f is a directory then cd into it
cd "{$f}"
for b in $runlist; do
if [[ -e "{$b}.png" ]]; then
echo "Found {$b}"
#if the file exists then say so
fi
done
cd -
fi
done
'''
【问题讨论】:
-
使用
find命令递归搜索层次结构,不要自己做。 -
尝试shellcheck.net 来验证您的脚本。
{$b}不好看,也许你想要${b}和${f} -
我需要做的不仅仅是最终找到它,这是脚本的简化版本,一旦它工作,我将添加它。 find 命令不会做我需要的一切。
-
您可以使用
for f in */; do ...; done开始循环,因为*/将扩展到目录,因此如果它是一个目录,您就不必进行测试。如果 cd 失败并且不继续,cd "$f" || exit也可以立即退出脚本。正如@Barmar 关于使用find所说,您可以使用-exec调用shell 并执行其他操作,或者使用globstar进行递归。 -
另外你需要做
"${runlist[@]}"将它扩展为一个数组而不仅仅是一个第一个元素,"$runlist"和"${runlist[0]}"是一样的
标签: bash directory conditional-statements file-exists