0

我一直试图弄清楚这一点。我已经阅读了多个线程,感觉我已经很接近了,但是脚本并没有放在一起。

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

这是我到目前为止所拥有的。

#!/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

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

任何帮助将不胜感激。

谢谢

4

1 回答 1

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 的[[test 关键字。在测试表达式中扩展一个 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
于 2013-02-02T03:46:17.903 回答