Итак, у меня есть скрипт проигрывателя «player.sh» и скрипт обновления «updater.sh».
player.sh воспроизводит любой mp3-файл в /home/filepath/, используя подстановочный знак *.mp3, это работает так, как и ожидалось.
Мне нужно, чтобы updater.sh заснул на 15 секунд, затем смонтировал usb-накопитель "sda1" в /media/pi, а затем проверил, является ли *.mp3 в /media/pi более новым, чем *.mp3 в home/filepath/
Если файл более новый, pkill отключает воспроизведение mp3, использует RM для удаления всех *.mp3 из /home/filepath/, копирует более новый *.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 … ]]
Если у вас есть только один файл в каждом каталоге, этодолженработа нестабильна. В противном случае приказ бессмыслен и потерпит неудачу.
Вам нужно использовать -nt
только два файла одновременно. Вы можете сделать что-то вроде
for b in /home/filepath/*.mp3
do
b_base="${b##*/}"
if [[ /media/pi/"b_base" -nt "$b" ]] ; then (do something) …
︙
Кроме того, вы используете . &
там, где следует использовать &&
.