0

我正在尝试组织我的音乐收藏的专辑封面,用于 XBMC 等,以及我个人基于强迫症的原因。为此,我想遍历我的音乐收藏中的每个文件夹,(因此还有文件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

问题

  1. cd $i总是失败,因为目录不存在。
  2. $i >> missing总是失败,权限被拒绝错误,但是ls -l missing给出-rwxrwxrwx+ 1 Username None 0 Sep 13 16:45 missing

更新:

在尝试了几次迭代以使脚本正常工作后,我不得不放弃并简单地使用这个专辑封面下载器,事后看来这是显而易见的事情。我用修改后的脚本将答案标记为已接受,因为它让我更接近我所知道的解决方案。

4

2 回答 2

1

cd $i对于像“艺术家姓名 - 歌曲名称.mp3”这样的文件将失败。外壳会Artist Name在空白处将其分解为等,它会破坏。您可以在调试问题$i之前打印。cd

$i >> missing将失败,因为您试图$i作为脚本执行并将内容输出到丢失。如果你想输入文件名,你应该使用类似echo "$i" >> missing.

我建议您使用真正的脚本语言,例如 Perl 或 Python,而不是在 shell 中执行此操作。名称中带有空格的文件真的很痛苦。

于 2012-09-13T16:03:56.860 回答
1

1) cd $i 总是失败,因为目录不存在。

由于结果与find . -type -d您的初始工作目录相关,因此您需要 cd 回到基本目录,然后再执行下一个cd $1. 返回上一个目录的快速方法是cd -.

2) $i >> missing 总是失败,出现权限被拒绝错误,

这里有两个问题。首先,通过这样做,$i >> missing您实际上是在尝试$i作为命令执行。如果要将文件名附加到文件中,则需要使用echo $i >> missing.

其次,您是在初始工作目录中创建的,因此一旦您在其他地方编辑missing,您实际上是在处理不同的文件。要引用同一个文件,请使用绝对路径。missingcd

试试这个:(我试图让脚本尽可能接近你所拥有的,并评论了我改变的行。我还引用了所有路径以更好地处理带空格的文件名)

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

ps 以防万一您没有注意到,请注意,如果您*.jpg在一个目录中有多个文件,您的脚本基本上会反复覆盖cover.jpg最后一个作为实际版本的文件。cp: 'cover.jpg' and 'cover.jpg' are the same file此外,如果您有多个 jpg 文件并且cover.jpg已经存在,您可能会看到错误“ ”。

于 2012-09-13T16:04:13.883 回答