使用inotifywait和avconv解释bash脚本中的字符串

时间:2013-01-31 13:38:01

标签: bash ubuntu scripting

所以我编写了一个bash脚本,用于将新写入视频文件并对其进行转码以进行播放,并在我的服务器中进行流式处理,这是脚本

  while true; do
    printf -v filename '%q' "$(inotifywait --format "%w""%f" -r -e close_write /var/$
    echo $filename
            if [[ $filename == *".mp4"* ]]; then
                    echo "1"
                    avconv -i "$filename" "`echo ${filename%.mp4}.webm`"
            fi

            if [[ $filename == *".mkv"* ]]; then
                    echo "2"
                    avconv -i "$filename" "`echo ${filename%.mkv}.mp4`"
                    avconv -i "$filename" "`echo ${filename%.mkv}.webm`"
            fi

            if [[ "$filename" == *".avi"* ]]
                    then echo "3"
                    avconv -i "$filename" "`echo ${filename%.avi}.mp4`" &
                    avconv -i "$filename" "`echo ${filename%.avi}.webm`"&
                 fi
      done

该脚本运行得相当好,但是如果$ filename包含空格avconv中断并且脚本返回:

      Watches established.
      /var/www/media2net/tv/The\ Daily.mkv
      2
      avconv version 0.8.4-4:0.8.4-0ubuntu0.12.04.1, Copyright (c) 2000-2012 the Libav s
      built on Nov  6 2012 16:51:33 with gcc 4.6.3
       /var/www/media2net/tv/The\: No such file or directory
      avconv version 0.8.4-4:0.8.4-0ubuntu0.12.04.1, Copyright (c) 2000-2012 the Libav 
      built on Nov  6 2012 16:51:33 with gcc 4.6.3
      /var/www/media2net/tv/The\ Daily.mkv: No such file or directory
      Setting up watches.  Beware: since -r was given, this may take a while!
      Watches established.

然而这是不正确的,因为我可以在它的相应目录中查看所述文件,我还在shell中测试了以下内容的avconv,一切正常并且avconv转码视频

       avconv -i /var/www/media2net/The\ Daily.mkv /var/www/media2net/tv/The\ Daily.webm

基本上我想知道我在我的脚本中做错了什么或者是否有其他人使用avconv或ffmpeg遇到了类似的问题(因为2是相当类似的,avconv是ubuntu的项目分支)任何帮助都将非常感谢! 提前致谢 -brendan

1 个答案:

答案 0 :(得分:1)

您使用转义反斜杠和引号时似乎存在一些不一致之处。事实上,你只需要两个中的一个,而且更容易使用的当然是引号。

因此,删除文件名中的反斜杠是第一件好事。

此外,

"$(inotifywait --format "%w""%f"...

应更正:

"$(inotifywait --format '%w%f'...

此外,理解类似的内容:

"`echo ${filename%.mkv}.mp4`"

有点含糊不清,事实上,如果$filename中有一个空格 - 两个字符链 - 你正在回应 - 。它应该在:

中纠正
"${filename/%.mkv/.mp4}"