我一直在试图弄清楚这个问题。 我已经通读了多个线程,感觉我很接近,但脚本就是没有组合在一起。
场景:我有一个媒体服务器和数千个电影文件。 每个影片文件都有各种附件文件,例如封面插图、数据库信息、同人作品和预告片。 虽然目录中的所有内容都有封面和数据库信息,但某些文件可能有也可能没有各自的同人作品或预告片。 对于这些文件,我正在尝试让这个脚本工作,它将创建一个空的"虚拟"文件来代替应该存在的文件。 然后,当我真正有时间时,我可以回去搜索虚拟文件,并努力填补我所能填补的空白。
这是我到目前为止所拥有的。
#!/bin/bash
find . -type f -print0 | while read -d $' ' 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
这应该很简单,但我认为我没有为进入测试运算符的输入字符串获得正确的格式。
任何帮助将不胜感激。
谢谢
逐行分析:
find . -type f -print0 | while read -d $' ' 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