获取没有特定文件类型cygwin / bash的目录

时间:2012-09-13 15:57:06

标签: bash loops scripting cygwin

我正在尝试整理我的音乐收藏的专辑封面,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

问题

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

    在尝试了几次迭代以使脚本工作之后,我不得不放弃并简单地使用这个Album Art Downloader,事后看来这是显而易见的事情。我正在接受修改后的脚本标记答案,因为它让我更接近我知道的解决方案,在某处。

2 个答案:

答案 0 :(得分:1)

对于像“艺术家姓名 - 歌曲名称.mp3”这样的文件,

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”。