つまり、プレーヤー スクリプト「player.sh」とアップデータ スクリプト「updater.sh」があります。
player.sh はワイルドカード *.mp3 を使用して /home/filepath/ 内の任意の mp3 ファイルを再生します。これは期待どおりに動作します。
私がしたいのは、updater.sh を 15 秒間スリープさせ、USB ドライブ「sda1」を /media/pi にマウントし、/media/pi の *.mp3 が home/filepath/ の *.mp3 より新しいかどうかを確認することです。
ファイルの方が新しい場合は、mp3 の再生を pkill し、RM を使用して /home/filepath/ からすべての *.mp3 を削除し、新しい *.mp3 を /home/filepath/ にコピーしてから、player.sh を再度起動して新しいファイルを再生します。
しかし、これは実行されません...。
#!/bin/bash
while [ 1 ] ; do
sleep 15
sudo mount /dev/sda1 /media/pi
if [[ /media/pi/*.mp3 -nt /home/filepath/*.mp3 ]] ; then sudo pkill mpg123 & sudo rm /home/filepath/* & cp /media/pi/*.mp3 /home/filepath/ & sh /home/filepath/player.sh & echo "updated"
else echo "not updated"
fi
sudo amount -l /media/pi
done
ターミナルには「更新されていません」と表示されます。
何をしても、スクリプトはファイルの変更日が同じであると認識しますが、「stat」を使用してファイルを確認すると、変更日には数時間の差があります。
何か案は?
ありがとう!
答え1
のように言うと[[ /dir1/* -nt /dir2/* ]]
、シェルはそれを次のように展開します。
[[ /dir1/f1 /dir1/f3 … -nt /dir2/f2 /dir2/f3 … ]]
各ディレクトリにファイルが1つだけある場合、これはすべき不安定に動作します。そうでない場合、コマンドは無意味となり、失敗します。
-nt
一度に2つのファイルだけに使用する必要があります。次のようにするといいでしょう。
for b in /home/filepath/*.mp3
do
b_base="${b##*/}"
if [[ /media/pi/"b_base" -nt "$b" ]] ; then (do something) …
︙
また、&
を使用すべき場所でを使用しています&&
。