【问题标题】:Get directories without specific filetype cygwin/bash获取没有特定文件类型 cygwin/bash 的目录
【发布时间】:2023-03-25 03:05:01
【问题描述】:

我正在尝试整理我的音乐收藏的专辑封面,出于 XBMC 等原因以及我个人基于强迫症的原因。为此,我想遍历我的音乐收藏中的每个文件夹(music 中也有文件,因此$(find . -type 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

问题

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

更新:

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

【问题讨论】:

    标签: bash loops scripting cygwin


    【解决方案1】:

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

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

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

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

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

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

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

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

    【讨论】:

    • 感谢您到目前为止的帮助,我忘了在您的第一个答案中提及,IFS=$'\n' 需要正确循环,否则它将文件夹名称中的所有空格视为下一个变量
    • 当然。我只是复制了相关的部分。为了完整起见,我将其放入。另一种选择是使用find . -type d | while read i; do ...,在这种情况下您不需要更改IFS
    【解决方案2】:

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

    $i >> missing 将失败,因为您试图将$i 作为脚本执行并将内容输出到丢失。如果要输入文件名,则应使用echo "$i" >> missing 之类的名称。

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

    【讨论】:

    • 感谢您的回答,您对处理cd $i 问题有什么建议,或者Perl 或Python 中的替代脚本,如果要求一个不是太厚颜无耻的话?无论哪种方式都感谢
    猜你喜欢
    • 1970-01-01
    • 2016-06-27
    • 2021-05-16
    • 1970-01-01
    • 2022-06-13
    • 2014-06-15
    • 2018-04-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多