【问题标题】:Convert File If Not Exists如果文件不存在则转换文件
【发布时间】:2016-09-05 20:52:33
【问题描述】:

我正在尝试编写bash 脚本。我想要的是以下

1) 递归扫描目录中所有.mkv 文件
2) IF .mkv 文件找到检查
a) 如果.mkv 文件正在使用中
i) 如果是,请离开目录
ii) 如果没有继续处理
b) 检查 CURRENT 目录是否有.mp4
i) 如果是,请执行
ii) 如果没有转换为.mp4
3) 扫描下一个目录



这是我目前的剧本,我认为除了两部分之外,我拥有所有的元素

1) 捕获当前目录
2) 检查当前目录是否有.mp4

我尝试使用$PWD 命令捕获当前目录,但它总是只返回此目录/home/omartinez/Downloads

我必须怎么做才能完成上面的两个未知步骤?

#/bin/sh
#recursive file search

#setting the directory to scan and filetype to scan for
for f in $(find /home/omartinez/Downloads) -name '*mkv' );
do
  #checking if the file is open
  if lsof $f
  then
    #this file is in use
  else
    #the file is closed and can be converted
    avconv -i $f.mkv -codec copy $f.mp4 
  fi
done

编辑——
根据@M 的建议。下面的 Hicklen 我将我的代码修改为此(尝试使用该答案)

#/bin/sh
#recursive file search
for file in $(find /home/omartinez/Downloads -type f -name "*.mkv")
do
  if lsof $f
  then
    #this file is in use
    else
      find /home/owner/Downloads -wholename "$(echo ${file} | perl -pe 's|(.*)/(.*).mkv$|\1/\2.mp4|')" > /dev/null
      || convert ${file} $(echo ${file} | perl -pe 's|(.*)/(.*).mkv$|\1/\2.mp4|')
fi

完成

但是,这会产生以下错误:

./search: 第 16 行:意外标记附近的语法错误 ||' ./search: line 16: ||转换 ${file} $(echo ${file} | perl -pe 's|(.)/(.).mkv$|\1/\2.mp4|')'

我确信这对我来说是 100%,但有人能指出我做错了什么吗?

编辑——
使用@jil 下面的建议,它递归地扫描我的整个系统,而不仅仅是列出的位置。我通过观察它扫描目录来验证这一点,例如

/usr/
/火狐
/Teamviewer

这是我使用的语法:

for file in $(find /home/omartinez/Downloads -type f -name "*.mkv"); do mp4=${file%.mkv}.mp4 if ! lsof $f && [ ! -e "$mp4" ]; then convert $file $mp4 fi done

有没有办法实现我的目标?

【问题讨论】:

    标签: bash file scripting


    【解决方案1】:

    也许这样的事情会有所帮助:

    for file in $(find . -type f -name "*.mkv")
    do
        find . -wholename "$(echo ${file} | perl -pe 's|(.*)/(.*).mkv$|\1/\2.mp4|')" > /dev/null
        || convert ${file} $(echo ${file} | perl -pe 's|(.*)/(.*).mkv$|\1/\2.mp4|')
    done
    
    • 查找以 .mkv 结尾的文件并设置为变量
    • 将文件名发送到 perl 以去除路径;定位 定位mp4版本并丢弃结果
    • 如果没有找到 mp4,使用文件名和剥离路径将 mkv 版本转换为 mp4

    【讨论】:

      【解决方案2】:

      ./search: line 8: syntax error near unexpected token else 的语法错误是由空的if 子句引起的。试试:

       if ! lsof $f
          find ...
       fi
      

      如果你不想在文件正在使用的情况下做任何事情。

      总体而言,您的解决方案似乎过于复杂。比如:

      for file in $(find /home/omartinez/Downloads -type f -name "*.mkv"); do
          mp4=${file%.mkv}.mp4
          if ! lsof $f && [ ! -e "$mp4" ]; then
              convert $file $mp4
          fi
      done
      

      【讨论】:

      • 我观察终端线路,它通过 Teamviewer 目录,然后是 firefox 目录,然后是 /usr 目录。用于某些扫描所有目录。
      猜你喜欢
      • 2012-05-10
      • 2013-12-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-05-29
      • 1970-01-01
      • 2016-06-18
      相关资源
      最近更新 更多