![Raspberry Pi ヘッドレス、if [[ file1 -nt file 2 ]] は 2 つのファイルの変更日が同じであると認識します](https://rvso.com/image/1567389/Raspberry%20Pi%20%E3%83%98%E3%83%83%E3%83%89%E3%83%AC%E3%82%B9%E3%80%81if%20%5B%5B%20file1%20-nt%20file%202%20%5D%5D%20%E3%81%AF%202%20%E3%81%A4%E3%81%AE%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%81%AE%E5%A4%89%E6%9B%B4%E6%97%A5%E3%81%8C%E5%90%8C%E3%81%98%E3%81%A7%E3%81%82%E3%82%8B%E3%81%A8%E8%AA%8D%E8%AD%98%E3%81%97%E3%81%BE%E3%81%99.png)
つまり、プレーヤー スクリプト「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) …
︙
また、&
を使用すべき場所でを使用しています&&
。