如何在 Bash 中迭代文件目录而不包含子目录

如何在 Bash 中迭代文件目录而不包含子目录

我需要解析包含文件和子目录的目录,但是我无法使用 find 命令。 for 循环应该遍历每个文件并将其与另一个目录进行比较,但我无法让它传递子目录。

difference=0
for item in $1
do 
     if [[ -d $item ]]
     then 
             continue
     fi
     if [ ! -f "$2/$(basename $item)" ]
     then
          echo "$2/$(basename $item) is missing"
          difference=1 
     fi
     if [ diff $item "$2/$(basename $item)" ]
     then
          echo "$1/$(basename $item) is different"
          difference=1
     fi
done 

使用上面的代码确实会跳过子目录,但也不比较文件。我知道如果我省略带有 continue 和 put 的第一个 if 语句:

for item in $(find $1 -type f)

它有效,但我无法使用该功能。任何帮助是极大的赞赏。此外,我还有另一个目录与此目录进行比较,因为它的代码相同,我没有写下来。

答案1

这是解决您的问题的最自然的方法。

find . -type f -maxdepth 1  |  ...

我无法使用该功能。

请更新您的问题以描述您的设置中阻止运行 /usr/bin/find 的约束。


但也不比较文件。

     if [[ -d $item ]]
     ...
     if [ ! -f "$2/$(basename $item)" ]
     ...
     if [ diff $item "$2/$(basename $item)" ]

迭代很好。

你想要的最后一个条款是

     if diff $item "$2/$(basename $item)"

也就是说,您想要if查看diff退出状态,而不涉及test( )。[

注意这两行之间的区别:

     if [ diff $item "$2/$(basename $item)" ]
     if   diff $item "$2/$(basename $item)"

让我们向 bash 询问一些示例问题。

$ if   true;    then echo Yes; fi
Yes
$ if   false;   then echo Yes; fi
$ if [       ]; then echo Yes; fi
$ if [ true  ]; then echo Yes; fi
Yes
$ if [ false ]; then echo Yes; fi
Yes
$ if [ apple ]; then echo Yes; fi
Yes

请注意,[内置的 bash 大约相当于 /usr/bin/[ ,它是 /usr/bin/test 的同义词。另外,我们在这里调用 /usr/bin/true 和 /usr/bin/false。它们提供 1 和 0 的退出状态。在其中四种情况下我们不会分叉任何子子进程。


在编写脚本时,您可能会发现 linter 很有shellcheck用。

相关内容