他の人が説明したように、使用するのinotify
がより良い解決策です。スクリプトが失敗する理由を説明します。まず第一に、どの言語でプログラミングしていても、何かをデバッグしようとするときはいつでも、最初のルールは「すべての変数を出力する」ことです。
$ ls
file1 file2 file3
$ echo $PWD
/home/terdon/foo
$ for FILE in "${PWD}/*"; do echo "$FILE"; done
/home/terdon/foo/*
したがって、上記のように、$FILE
実際にはに展開され$PWD/*
ます。したがって、ループは文字列に対して 1回だけ実行さ/home/terdon/foo/*
れ、ディレクトリ内の各ファイルに対して個別に実行されることはありません。次に、md5sum
コマンドは次のようになります。
md5sum /home/terdon/foo/*
つまり、md5sum
ターゲットディレクトリのすべてのファイルではなく、一度にすべてのファイルで実行されます。
問題は、グロブ拡張を引用していて、それが拡張されないようにすることです。
$ echo "*"
*
$ echo *
file1 file2 file3
一方で、変数はほとんど必要があります常に引用されているが、文字列の代わりの塊にそれらを作るために、グロブはいけません。
あなたがやろうとしていたことは:
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
ます。