Saya memiliki skrip berikut yang memeriksa apakah ada file dalam folder dan apakah file tersebut stabil (ini untuk file video besar yang saya terima).
#!/bin/bash
cdate1=$(date +%Y%m%d-%T)
folder1="/path-to-folder"
cd $folder1
while file=$(ls "$folder1")
[ -z "$file" ]
do sleep 10
done
echo "There is a file in the folder at $cdate1"
size1=$(stat -c '%s' "$file")
echo "The size1 is $size1"
sleep 30
size2=$(stat -c '%s' "$file")
echo "The size2 is $size2"
if [ $size1 = $size2 ]
then
ls -l
echo "Start converting"
else
echo "Restart the script"
fi
Bagaimana cara memodifikasi skrip sehingga dapat memeriksa beberapa file dalam folder yang sama dan setelah semuanya stabil untuk memulai skrip konversi?
Jawaban yang Diterima:
ada beberapa masalah dalam skrip Anda, dimulai dengan:
folder1="path-to-folder"
cd $folder1
while file=$(ls "$folder1") ...
ini benar-benar cd path-to-folder; ls path-to-folder
; jika path-to-folder
adalah absolut (dimulai dengan '/' seperti pada contoh Anda) ini mungkin berhasil, tetapi tidak akan berfungsi setiap kali Anda menggunakan jalur relatif.
itu juga tidak akan berfungsi jika path-to-folder
berisi spasi, karena Anda harus menggunakan tanda kutip di mana-mana, mis. cd "$folder1"
lalu lakukan while file=$(ls ...)
akan melakukan infinite loop, sebagai file
akan selalu disetel ke sesuatu (isi direktori).
sintaks yang tepat adalah for file in $(ls ...)
, yang akan berhenti bekerja segera setelah Anda memiliki nama file dengan spasi (karena loop akan berjalan di foo
dan bar
jika Anda memiliki file bernama foo bar
). periksa mengapa Anda tidak boleh mem-parsing output ls. daripada menggunakan ls
anda cukup melakukan for file in *
.
akhirnya, Anda dapat memiliki file yang berubah meskipun ukurannya tidak berubah lagi.
cara yang baik untuk mengulangi file adalah find
memerintah; cara yang baik untuk memeriksa apakah sesuatu telah berubah adalah mtime
dari sebuah file.
fungsi berikut memberi Anda nilai untuk modifikasi terakhir (mtime) dari file apa pun di direktori yang diberikan
folder1="/path-to-folder"
find "${folder1}" -exec stat -c "%Y" \{\} \; \
| sort -n | tail -1
sehingga skrip Anda akan terlihat seperti:
#!/bin/bash
dir="$1"
# check whether $dir exists
test -d "${dir}" || exit 1
last=0
current=1
while [ "$last" != "$current" ]; do
last=$current
current=$(find "${dir}" -exec stat -c "%Y" \{\} \; \
| sort -n | tail -1)
sleep 10
done
echo "directory is now stable..."
PERBARUI
pendekatan yang lebih baik lagi adalah dengan secara aktif memberi tahu penerima bahwa file yang diberikan telah dikirimkan.
solusi yang sangat sederhana adalah dengan juga menyalin file dummy kosong setelah muatan dikirim. misalnya untuk file bernama foo.avi
salin file lain foo.avi.copyfinished
; jadi Anda hanya perlu memeriksa keberadaan foo.avi.copyfinished
untuk melihat foo.avi
sudah siap.
while true; do
for file_ready in *.copyfinished; do
file=${file_ready%.copyfinished}
if [ -e "${file}.converted" ]; then
echo "skipping already converted file ${file}" 1>&2
else
touch "${file}.converted"
do_convert "${file}"
fi
done
sleep 1
done
solusi ini jelas membutuhkan kerjasama dari pihak pengirim.
Terkait:arduino – Memprogram Beberapa IC menggunakan Bus USBasp/SPI tunggal dan Arduino IDE?