正如其他人所解释的那样,使用inotify
是更好的解决方案。我只解释为什么您的脚本失败。首先,无论您使用哪种语言编程,每当尝试调试某些内容时,第一个规则都是“打印所有变量”:
$ ls
file1 file2 file3
$ echo $PWD
/home/terdon/foo
$ for FILE in "${PWD}/*"; do echo "$FILE"; done
/home/terdon/foo/*
因此,如您在上面看到的,$FILE
实际上扩展为$PWD/*
。因此,循环仅在字符串 上运行一次/home/terdon/foo/*
,而不在目录中的每个文件上单独运行。然后,md5sum
命令变为:
md5sum /home/terdon/foo/*
换句话说,它md5sum
一次在目标目录中的所有文件上运行,而不是在每个文件上运行。
问题是您引用了glob扩展,这阻止了它的扩展:
$ echo "*"
*
$ echo *
file1 file2 file3
尽管变量应该几乎总是用引号引起来,但不应该使用glob,因为这会使它们成为字符串而不是glob。
您的意思是:
for FILE in "${PWD}"/*; do ...
但是,这里没有理由使用$PWD
它,没有添加任何有用的东西。上面的行等效于:
for FILE in *; do
另外,请避免对外壳程序变量使用大写字母。这些用于系统设置的环境变量,最好将自己的变量保留为小写。
考虑到所有这些,这是脚本的一个有效的改进版本:
#!/bin/bash
for file in *
do
sum1="$(md5sum "$file")"
sleep 2
sum2="$(md5sum "$file")"
if [ "$sum1" = "$sum2" ];
then
echo "Identical"
else
echo "Different"
fi
done
for FILE in "${PWD}"/*; do
在同一集合上工作,for FILE in *; do
但并不完全等效,因为后者不包含路径名。