我需要解析包含文件和子目录的目录,但是我无法使用 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
用。