如何在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 函数?

如何在 bash shell 中将一个字符串拆分为多个字符串,至少用一个空格分隔?

如何在单个 bash 变量中使用多个主机名?

如何将带有管道符号的多个参数传递到bash脚本案例语句中

在linux shell(bash)编程中,如何通过递归方式遍历文件