Bash 脚本和文件冲突

Bash 脚本和文件冲突

并提前感谢任何建议。

我在其他地方找不到问题的答案。我一直在编写一个脚本,该脚本将监视目录,然后根据某些条件将文件移动到其他各个目录。以下是我目前得到的结果:

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

虽然我不明白为什么要保留两个目录下每个文件的副本,但为什么不使用mvcp

@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启动时就在那里)。

相关内容