次のスクリプトを使用して、フォルダにファイルがあるかどうか、ファイルが安定しているかどうかを確認します(これは受信している大きなビデオファイル用です)。
#!/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
同じフォルダ内の複数のファイルをチェックし、それらすべてが安定して変換スクリプトを開始できるようにスクリプトを変更するにはどうすればよいですか?
承認された回答:
スクリプトには、次のような問題がいくつかあります。
folder1="path-to-folder"
cd $folder1
while file=$(ls "$folder1") ...
これは実際にcdpath-to-folderを実行します。 lsパスからフォルダへ
; path-to-folder
の場合 絶対です(例のように「/」で始まります)これは機能する可能性がありますが、相対パスを使用する場合は常に機能しません。
path-to-folder
> どこでも引用符を使用する必要があるため、スペースが含まれています。 cd "$ folder1"
次に、 while file =$(ls ...)
を実行します file
のように、無限ループを実行します 常に何かに設定されます (ディレクトリの内容)。
適切な構文は、 for file in $(ls ...)
です。 、スペースを含むファイル名があるとすぐに機能を停止します(ループは foo
で実行されるため) およびbar
foo bar
という名前のファイルがある場合 )。 lsの出力を解析してはいけない理由を確認してください。 ls
を使用する代わりに *のファイルに対してを実行するだけです。 。
最後に、サイズが変更されていなくても、ファイルが変更されている可能性があります。
ファイルを反復処理する良い方法は、 find
です。 指図;何かが変更されたかどうかを確認する良い方法は、 mtime
です。 ファイルの。
次の関数は、指定されたディレクトリ内の任意のファイルの最終変更(mtime)の値を提供します
folder1="/path-to-folder"
find "${folder1}" -exec stat -c "%Y" \{\} \; \
| sort -n | tail -1
したがって、スクリプトは次のようになります。
#!/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..."
更新
さらに良いアプローチは、特定のファイルが送信されたことを受信者に積極的に通知することです。
非常に簡単な解決策は、ペイロードが送信された後に空のダミーファイルもコピーすることです。例えば foo.avi
という名前のファイルの場合 別のファイルをコピーするfoo.avi.copyfinished
;したがって、 foo.avi.copyfinished
の存在を確認するだけで済みます。 そのfoo.avi
を確認するには 準備ができています。
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
このソリューションには、明らかに送信側の協力が必要です。
関連:arduino –単一のUSBasp /SPIバスとArduinoIDEを使用して複数のICをプログラミングしますか?