我正在尝试整理我的音乐收藏的专辑封面,XBMC等以及我个人的基于OCD的原因。为此,我想循环浏览我的音乐集中的每个文件夹(music
中还有文件$(find . -type d)
。我检查每个文件夹中是否存在jpeg。如果存在,则为复制被称为cover.jpg
。如果没有找到jpeg,应该将文件夹的名称添加到列表中,然后我将自己搜索谷歌。我正在使用的代码如下。
#!/bin/bash
IFS=$'\n'
touch missing
cd /cygdrive/d/music
for i in $(find . -type d)
do cd $i
if [ -e '*.jpg' ]
then
for j in *.jpg
do cp $j 'cover.jpg'
done
else
cd ..
$i >> missing
fi
done
cd $i
总是失败,因为目录不存在。$i >> missing
始终失败,拒绝权限错误,但ls -l missing
提供-rwxrwxrwx+ 1 Username None 0 Sep 13 16:45 missing
在尝试了几次迭代以使脚本工作之后,我不得不放弃并简单地使用这个Album Art Downloader,事后看来这是显而易见的事情。我正在接受修改后的脚本标记答案,因为它让我更接近我知道的解决方案,在某处。
答案 0 :(得分:1)
cd $i
将失败。 shell将在空格上将其分解为Artist
Name
等,它将会中断。您可以在执行$i
之前打印cd
来调试问题。
$i >> missing
将失败,因为您尝试将$i
作为脚本执行并将内容输出为missing。如果要放置文件名,则应使用echo "$i" >> missing
之类的内容。
我建议您使用像Perl或Python这样的真实脚本语言,而不是在shell中执行此操作。名称中带有空格的文件真的很痛苦。
答案 1 :(得分:1)
1)cd $ i总是失败,因为目录不存在。
由于find . -type -d
的结果与初始工作目录的位置相关,因此在执行下一个cd $1
之前,您需要回到基本目录。返回上一个目录的快速方法是cd -
。
2)$ i>>丢失总是失败,权限被拒绝错误,
这里有两个问题。首先,通过执行$i >> missing
,您实际上尝试执行$i
作为命令。如果您希望将文件名附加到文件中,则需要使用echo $i >> missing
。
其次,您在初始工作目录中创建了missing
,因此,当您在其他地方missing
编辑时,您实际上正在处理其他cd
文件。要引用同一文件,请使用绝对路径。
试试这个:(我试着让脚本尽可能接近你所拥有的,并对我改变的行进行评论。我还引用了所有路径来更好地处理带空格的文件名)
#!/bin/bash
IFS=$'\n'
MISSING="$(pwd)/missing" # store absolute path
> "$MISSING". # create new or empty existing
cd /cygdrive/d/music
for i in $(find . -type d)
do
cd "$i"
if [ -e *.jpg ] # wildcard not expanded if quoted
then
for j in *.jpg
do cp "$j" 'cover.jpg'
done
else
echo "$i" >> "$MISSING" # use $MISSING
fi
cd - # go back to previous directory
done
P.S。如果您没有注意到,请注意,如果目录中有多个*.jpg
文件,您的脚本将基本上重复覆盖cover.jpg
,最后一个文件最终为实际版本。此外,如果您有多个jpg文件且cp: 'cover.jpg' and 'cover.jpg' are the same file
已存在,则可能会看到错误“cover.jpg
”。