GNU/Linux >> Belajar Linux >  >> Linux

Tunggu Beberapa File Selesai Diunduh?

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?
Linux
  1. KRename – Pengubah Nama File Batch yang Kuat untuk Linux

  2. Linux:hapus ekstensi file untuk banyak file

  3. Butuh editor hex yang bagus untuk Linux

  1. Menghapus bagian dari nama file untuk banyak file di Linux

  2. Mencari string di banyak file di Linux

  3. Apa solusi yang bagus untuk penandaan file di linux?

  1. 7 tips baris perintah Linux untuk menghemat ruang file media

  2. Diff/patch biner untuk file besar di linux?

  3. alat untuk memisahkan file pcap dengan koneksi TCP?