Seperti yang telah dijelaskan orang lain, menggunakan inotify
adalah solusi yang lebih baik. Saya hanya akan menjelaskan mengapa skrip Anda gagal. Pertama-tama, apa pun bahasa pemrograman Anda, kapan pun Anda mencoba men-debug sesuatu, aturan pertama adalah "cetak semua variabel":
$ ls
file1 file2 file3
$ echo $PWD
/home/terdon/foo
$ for FILE in "${PWD}/*"; do echo "$FILE"; done
/home/terdon/foo/*
Jadi, seperti yang Anda lihat di atas, $FILE
sebenarnya diperluas ke $PWD/*
. Oleh karena itu, loop hanya dijalankan sekali pada string /home/terdon/foo/*
dan bukan pada masing-masing file dalam direktori secara individual. Kemudian, md5sum
perintahnya menjadi:
md5sum /home/terdon/foo/*
Dengan kata lain, ini berjalan md5sum
pada semua file di direktori target sekaligus dan tidak pada masing-masing file.
Masalahnya adalah Anda mengutip ekspansi glob Anda dan itu menghentikan ekspansi:
$ echo "*"
*
$ echo *
file1 file2 file3
Sementara variabel hampir selalu dikutip , gumpalan tidak seharusnya karena itu membuat mereka menjadi string, bukan gumpalan.
Yang ingin Anda lakukan adalah:
for FILE in "${PWD}"/*; do ...
Namun, tidak ada alasan untuk digunakan di $PWD
sini, itu tidak menambahkan sesuatu yang bermanfaat. Baris di atas setara dengan:
for FILE in *; do
Juga, hindari menggunakan huruf MODAL untuk variabel shell. Itu digunakan untuk variabel lingkungan yang ditetapkan sistem dan lebih baik menjaga variabel Anda sendiri dalam huruf kecil.
Dengan mengingat semua ini, inilah versi skrip Anda yang berfungsi dan lebih baik:
#!/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
bekerja pada set yang sama karenafor FILE in *; do
tidak persis sama karena yang terakhir tidak termasuk nama path.