如何在bash中使用多个ifs遍历多个目录?
Posted
技术标签:
【中文标题】如何在bash中使用多个ifs遍历多个目录?【英文标题】:How to iterate through multiple directories with multiple ifs in bash? 【发布时间】: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]"
是一样的
【参考方案1】:
欢迎使用 ***。
以下方法可以解决问题(find、array 和 if then else 的组合):
# list of files we are looking for
runlist=(1 2 4 8 16 32 64 128)
#find each of above anywhere below current directory
# using -maxdepth 1 because, based on on your exam you want to look one level only
# if that's not what you want then take out -maxdepth 1 from the find command
for b in $runlist[@]; do
echo
PATH_TO_FOUND_FILE=`find . -name $b.png`
if [ -z "$PATH_TO_FOUND_FILE" ]
then
echo "nothing found" >> /dev/null
else
# You wanted a postive confirmation, so
echo found $b.png
# Now do something with the found file. Let's say ls -l: change that to whatever
ls -l $PATH_TO_FOUND_FILE
fi
done
这是一个运行示例:
mamuns-mac:stack foo$ ls -lR
total 8
drwxr-xr-x 4 foo 1951595366 128 Apr 11 18:03 dir1
drwxr-xr-x 3 foo 1951595366 96 Apr 11 18:03 dir2
-rwxr--r-- 1 foo 1951595366 652 Apr 11 18:15 find_file_and_do_something.sh
./dir1:
total 0
-rw-r--r-- 1 foo 1951595366 0 Apr 11 17:58 1.png
-rw-r--r-- 1 foo 1951595366 0 Apr 11 17:58 8.png
./dir2:
total 0
-rw-r--r-- 1 foo 1951595366 0 Apr 11 18:03 64.png
mamuns-mac:stack foo$ ./find_file_and_do_something.sh
found 1.png
-rw-r--r-- 1 foo 1951595366 0 Apr 11 17:58 ./dir1/1.png
found 8.png
-rw-r--r-- 1 foo 1951595366 0 Apr 11 17:58 ./dir1/8.png
found 64.png
-rw-r--r-- 1 foo 1951595366 0 Apr 11 18:03 ./dir2/64.png
【讨论】:
以上是关于如何在bash中使用多个ifs遍历多个目录?的主要内容,如果未能解决你的问题,请参考以下文章
在 Bash 中使用 getopts 检索单个选项的多个参数
如何在遍历一系列目录的循环中使用异步 readdir 函数?