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.md5sum -- "$file"
daripadamd5sum "$file"
menangani kasus di mana file dimulai dengan a-
. Tentu saja Anda juga harus membuat implementasi md5sum mendukung--
akhir opsi pembatas.Anda dapat menggunakan alat-alat inotify secara pasti dari baris perintah, misalnya seperti ini:
Dari manusia tidak menunggu
Dan berikut ini adalah skrip yang memonitor secara terus-menerus, disalin dari file manual
inotifywait
:sumber
Anda dapat menggunakan
inotify-tools
paket untuk memantau semua perubahan dalam folder secara real time. Misalnya, ini berisiinotifywait
alat, yang bisa Anda gunakan seperti:Anda dapat menggunakan tanda untuk memfilter peristiwa tertentu saja atau file tertentu. The
inotifywatch
alat Mengumpulkan filesystem statistik penggunaan dan output jumlah masing-masinginotify
acara.Anda dapat menemukan lebih banyak contoh di sini misalnya.
Jika Anda ingin memantau dengan alat lain, Anda dapat menggunakan
find
dengan-mmin
parameter (menit yang dimodifikasi). Karena 2 detik seperti 0,033 menit, Anda dapat menggunakan:sumber
Jika Anda ingin memantau pada interval dua detik, Anda dapat mengelilingi cek Anda dengan:
Meskipun ini akan secara berurutan menguji file dan akan menunggu 2 detik untuk setiap file yang ditemukan saya sarankan untuk mengubah cek Anda menjadi fungsi:
Yang bisa digunakan dalam
while
loop:Harap perhatikan tanda dan
&
untuk melakukan pemeriksaan di latar belakang untuk melakukan pemeriksaan file secara paralel. Perhatikan bahwa ini dapat berdampak pada kinerja tergantung pada jumlah file yang ditemukan di direktori.Juga perhatikan bahwa saya mengubah
echo
baris untuk memasukkan nama file ("$@"
) untuk memvisualisasikan file mana yang ditemukan identik / berbeda.sumber
sumber