【问题标题】:Bash scripting testing for existing file with arbitrary extension in a while or for loop在 while 或 for 循环中对具有任意扩展名的现有文件进行 Bash 脚本测试
【发布时间】:2013-01-17 11:23:04
【问题描述】:

我一直在尝试解决这个问题。我已经阅读了多个线程,感觉我已经很接近了,但是脚本并没有放在一起。

场景: 我有一个媒体服务器和数千个电影文件。每个电影文件都有各种附件文件,例如封面插图、数据库信息、同人图和预告片。虽然目录中的所有内容都有封面和数据库信息,但某些文件可能有也可能没有各自的同人图或预告片。对于这些文件,我试图让这个脚本工作,它将创建一个空的“虚拟”文件来代替应该存在的文件。然后当我真正有时间时,我可以回去只搜索虚拟文件并努力填补我可以填补的空白。

这是我目前所拥有的。

#!/bin/bash

find . -type f -print0 | while read -d $'\0' movie ; 
do
echo $movie
    moviename=${movie%\.*} #remove the extension from the string
    moviename1=`echo $moviename | sed 's/\ /\\ /'` #add escaped spaces to the string
    echo $moviename1  #echo the string (for debugging)
    if [ ! -f $moviename-fanart* ]; #because the fanart could be .jpg, or .png, etc
    then
        echo "Creating $moviename-fanart.dummy"
        touch "$moviename-fanart.dummy"
    fi
    if [ ! -f $moviename-trailer* ]; #because tralers could be .mp4, .mov, .mkv, .avi, etc
    then
        echo "Creating $moviename-trailer.dummy"
        touch "$moviename-trailer.dummy"
    fi
done

这应该很简单,但我认为我没有为进入测试运算符的输入字符串获得正确的格式。

任何帮助将不胜感激。

谢谢

【问题讨论】:

  • 什么不起作用?是没有正确创建虚拟文件,还是只是没有找到它们应该去的地方?

标签: file bash testing scripting


【解决方案1】:

逐行分析:

find . -type f -print0 | while read -d $'\0' movie; do

好的,但是使用 bash4,您可以只使用 shopt -s globstar 对目录进行递归操作。

    moviename=${movie%\.*} #remove the extension from the string

你不需要反斜杠。

    moviename1=`echo $moviename | sed 's/\ /\\ /'` #add escaped spaces to the string

这行是可疑的,因为如果你引用这个名字,转义的空格会变成双重转义。您将字符串的 与您看到的表示混淆了。

    if [ ! -f $moviename-fanart* ]; then #because the fanart could be .jpg, or .png, etc

引用字符串或使用 bash 的 [[ 测试关键字。在测试表达式中扩展一个 glob 有点危险,因为如果它匹配多个结果,你会得到一个错误。也就是说,如果您确定只有一个可以引用全局。 "$moviename-fanart"*.

        touch "$moviename-fanart.dummy"

在这里,你引用它。所以基本上你现在正在处理一个不同的名字。

    fi
    if [ ! -f $moviename-trailer* ]; then #because tralers could be .mp4, .mov, .mkv, .avi, etc
        echo "Creating $moviename-trailer.dummy"
        touch "$moviename-trailer.dummy"
    fi

同样的事情。

done

【讨论】:

  • 哇。谢谢。我会回来报告的。
  • globstar 将导致与给定的find 命令略有不同的行为,因为它也会匹配目录。
  • @chepner 如果所有电影都有扩展名而所有目录都没有,您可以:for movies in **/*.*。(您甚至可以使用-f 测试文件;-)
  • @MikeJ 如果有帮助,请接受答案!在小次郎:干得好!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-04-06
  • 1970-01-01
  • 1970-01-01
  • 2020-09-27
  • 1970-01-01
相关资源
最近更新 更多