并提前感谢任何建议。
我在其他地方找不到问题的答案。我一直在编写一个脚本,该脚本将监视目录,然后根据某些条件将文件移动到其他各个目录。以下是我目前得到的结果:
cd `dirname $0`/watch
while true
do
inotifywait -e moved_to ../watch --format "%f" | while read FILE
do
if $(echo "$FILE" | grep -q ".jpg"); then
cp "./$FILE" "../images/"
elif $(echo "$FILE" | grep -q ".mp4"); then
cp "./$FILE" "../videos/"
elif $(echo "$FILE" | grep -q ".mp3"); then
cp "./$FILE" "../audio/"
else
cp "./$FILE" "../other/"
fi
done
done
如果一次将一个文件移动到 ./watch 中,此脚本将正常工作,但如果移动多个文件,则只有第一个文件会从 ./watch 移动到相应的目录。这是我的另一个想法,但我不确定它将如何处理尝试排序/移动不完整文件等问题:
while true
do
inotifywait -e moved_to `dirname $0`/watch && /bin/bash `dirname $0`/autotorrent.sh
done
添加文件时将启动以下脚本:
cd `dirname $0`/watch
for i in *; do
if $(echo "$FILE" | grep -q ".jpg"); then
cp "./$FILE" "../images/"
elif $(echo "$FILE" | grep -q ".mp4"); then
cp "./$FILE" "../videos/"
elif $(echo "$FILE" | grep -q ".mp3"); then
cp "./$FILE" "../audio/"
else
cp "./$FILE" "../other/"
fi
done
我只是不确定如何最好地处理移动多个文件,这些文件可能需要花费相当长的时间进行复制。我有几个想法,但它们似乎都不是我想要的可靠解决方案。
再次感谢所有为我提供建议的人
答案1
由于您的文件可能很大,因此cp
需要花费一些时间。在此期间,您可能会错过通知。尝试将所有命令都放到cp
后台,方法是在&
每个命令后面附加一个。这样您就可以更快地返回inotifywait
。
grep
另外,你可以通过执行 以下操作来消除大量调用:
j=${i##*.}
case "$j" in
jpg) cp $i ../images/ & ;;
mp4) cp $i ../videos/ & ;;
mp3) cp $i ../audio/ & ;;
*) cp $i ../other/& ;;
esac
虽然我不明白为什么要保留两个目录下每个文件的副本,但为什么不使用mv
呢cp
?
@zpawwn:进一步man inotifywait
阅读后,我发现--monitor
,因此,您的脚本应该是:
cd `dirname $0`/watch
inotifywait -e moved_to ../watch --format "%f" --monitor | while read FILE
do
j="${FILE##*.}"
case "$j" in
jpg) mv "$FILE" ../images/ & ;;
mp4) mv "$FILE" ../videos/ & ;;
mp3) mv "$FILE" ../audio/ & ;;
*) mv "$FILE" ../other/& ;;
esac
done
让我们inotifywait
管理文件事件队列,并在注意到文件名时将其吐出。旧方法是inotifywait
找到一个新文件并退出,让您的cp
内容运行,然后重新开始观看。其他文件(同时到达)不再是新的(它们在第二个文件inotifywait
启动时就在那里)。