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

标签 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 时遇到过类似的问题(因为这两个非常相似并且 avconv 是该项目的 ubuntu 分支)任何帮助将不胜感激! 提前致谢 -布伦丹

最佳答案

您对转义反斜杠和引号的使用似乎有些不一致。事实上,你只需要两者之一,更容易使用的当然是引号。

因此,首先要删除文件名中的反斜杠。

此外,

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

应该在 :

中更正
"$(inotifywait --format '%w%f'...

此外,包含以下内容的行:

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

有点模棱两可,因为事实上,您在回显 - 如果 $filename 中有空格 - 两条字符链 -。它应该在 :

"${filename/%.mkv/.mp4}"

关于bash - 使用 inotifywait 和 avconv 解释 bash 脚本中的字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14627095/

相关文章:

linux - 在 docker-compose 命令中使用内联注释

linux - Grep 一件事然后从下面的行中删除

javascript - 使用 javascript 小书签在网页中查找 'old' 的所有实例并将每个实例替换为 'new'

linux - BASH - 从一天中提取日期

linux - bash循环增加计数

apache - 如何为 Zabbix 启用 HTTPS

php - 在 Ubuntu 中使用 Foreman 在本地运行 Heroku PHP 项目时权限不正确

javascript - 在 Intranet 中启用跨域脚本

linux - 保存到变量时如何格式化 grep 输出

ubuntu - Guacamole Guacd 安装 Ubuntu