Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
获取没有特定文件类型cygwin/bash的目录_Bash_Loops_Scripting_Cygwin - Fatal编程技术网

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

获取没有特定文件类型cygwin/bash的目录,bash,loops,scripting,cygwin,Bash,Loops,Scripting,Cygwin,我试图组织我的音乐收藏的专辑艺术,为XBMC等和我个人的强迫症的原因。为此,我想循环浏览音乐收藏中的每个文件夹,(在音乐中也有文件,因此$(查找。-键入d)。我检查每个文件夹是否存在jpeg。如果存在,则将其复制为cover.jpg。如果未找到jpeg,则应将文件夹的名称添加到列表中,然后我将自己搜索google。我使用的代码如下 #!/bin/bash IFS=$'\n' touch missing cd /cygdrive/d/music for i in $(find . -typ

我试图组织我的音乐收藏的专辑艺术,为XBMC等和我个人的强迫症的原因。为此,我想循环浏览音乐收藏中的每个文件夹,(在
音乐中也有文件,因此
$(查找。-键入d)
。我检查每个文件夹是否存在jpeg。如果存在,则将其复制为
cover.jpg
。如果未找到jpeg,则应将文件夹的名称添加到列表中,然后我将自己搜索google。我使用的代码如下

#!/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>>缺失
    总是会失败,出现权限被拒绝错误,但是
    ls-l缺失
    给出了
    -rwxrwx+1用户名无0 Sep 13 16:45缺失
  • 更新:
    在尝试了几次迭代以使脚本正常工作后,我不得不放弃并简单地使用它,这在事后看来是显而易见的。我正在用一个修改后的脚本标记答案,因为它使我更接近我所知道的解决方案,在某个地方。

    cd$I
    对于这样的文件将失败“Artister Name-Song Name.mp3”。外壳将在空白处将其拆分为
    Artister
    Name
    等,然后将其拆分。您可以在制作
    cd
    之前打印
    $i
    ,以调试问题

    $i>>missing
    将失败,因为您正试图将
    $i
    作为脚本执行,并将内容输出到missing。如果要输入文件名,应使用类似于
    echo“$i”>>missing
    的内容

    我建议您使用真正的脚本语言,如Perl或Python,而不是在shell中这样做。名称中带有空格的文件确实很麻烦

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

    由于
    find.-type-d
    的结果与您初始工作目录的位置有关,因此在执行下一个
    cd$1
    之前,您需要将cd放回基本目录。返回上一个目录的快速方法是
    cd-

    2) $i>>丢失始终失败,出现权限被拒绝错误

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

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

    试着这样做:(我尽量让脚本尽可能接近您的脚本,并对我更改的行进行了注释。我还引用了所有路径,以便更好地处理带有空格的文件名)


    p、 如果您没有注意到,请注意,如果目录中有多个
    *.jpg
    文件,您的脚本将基本上重复覆盖
    cover.jpg
    ,最后一个文件将作为实际版本。此外,您可能会看到错误“
    cp:'cover.jpg'和'cover.jpg'是同一个文件
    “如果您有多个jpg文件,并且
    cover.jpg
    已经存在。

    感谢您迄今为止的帮助,我忘了在您的第一个回答中提到,
    IFS=$'\n'
    需要正确循环,否则它会将文件夹名称中的所有空格视为下一个变量。我只是复制了相关的部分。为了完整起见,我将把它放进去。另一个选项是使用
    find-读i时输入d |;在这种情况下,您不需要更改
    IFS
    。感谢您的回答,您是否有处理
    cd$i
    问题的建议,或者如果您不太厚颜无耻地要求使用Perl或Python的替代脚本,您是否有任何建议?谢谢你
    #!/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