【问题标题】:Moving images into folders with image filename将图像移动到具有图像文件名的文件夹中
【发布时间】:2016-08-03 17:02:36
【问题描述】:

我有一个名为 folder1 的文件夹,里面有一堆图片,我想将每张图片保存在一个单独的文件夹中。该文件夹应与文件同名,例如,如果图片名为“st123”,我想创建一个名为“st123”的文件夹并将图片移动到该文件夹​​中。我尝试了以下方法,但我得到错误不能移动到自身的子目录。还有其他方法可以解决这个问题吗? 否则,是否可以将图像“st123”保存在名为“123”的文件夹中(最后三个字符)?

#!/bin/bash
Parent="/home/me/myfiles/folder1"
for file in $Parent; do
dir="${file%%.*}"
mkdir -p "$dir"
mv "$file" "$dir" 
done

【问题讨论】:

    标签: bash directory mkdir


    【解决方案1】:

    你几乎可以正常工作了!更改第 3 行的一部分,以便 for 循环遍历目录中的内容而不是目录本身:

    #!/bin/bash
    Parent="/home/me/myfiles/folder1"
    for file in $Parent/*; do
    dir="${file%%.*}"
    mkdir -p "$dir"
    mv "$file" "$dir" 
    done
    

    https://www.gnu.org/software/bash/manual/html_node/Command-Substitution.html#Command-Substitution

    【讨论】:

    • 是的,你应该使用 find (和你在链接中声明的 perl!)。我编辑了答案以反映这一点。该操作没有说明什么样的图像, *.jpg 可能不会有效,并且 *.{jpg,JPG,jpeg,JPEG,png,svg,.....} 仍然可能会遗漏一些内容一组不同的图像。
    • 永远不要这样做:for x in $(command)`command`$var。 for-in 用于迭代参数,而不是(输出)字符串。相反,请使用 glob(例如 *.txt)、数组(例如 "${names[@]}")或 while-read 循环(例如 while read -r line)。见mywiki.wooledge.org/BashPitfalls#pf1mywiki.wooledge.org/DontReadLinesWithFor
    • 此外,您使用的是find-print0,在这种情况下,这不仅没用,而且完全是错误的。
    【解决方案2】:

    此解决方案可能对您有用,但如果您想递归地遍历图像,我建议您使用find。如果确实如此,请告诉我,我将使用相关代码编辑此答案。

    for image in /home/me/myfiles/folder1/*; do
        if [[ -f $image ]]; then 
            newf="${image%%?([ab]).*}"
            mkdir -p "$newf"
            mv -- "$image" "$newf"
        fi
    done
    

    测试(extglob 已启用):

    $ [/home/rany/] touch test/st123a.tif test/st123b.tif test/st456.jpg test/st456b.jpg test/st789.tif
    $ [/home/rany/] for image in test/*; do newf="${image%%?([ab]).*}"; mkdir -p "$newf"; mv -- "$image" "$newf";done
    $ [/home/rany/] tree test
    test
    ├── st123
    │   ├── st123a.tif
    │   └── st123b.tif
    ├── st456
    │   ├── st456b.jpg
    │   └── st456.jpg
    └── st789
        └── st789.tif
    
    3 directories, 5 files
    

    编辑:

    根据 OP 要求,我添加了以下更改:

    • 修剪文件名的后缀 ab,这样,例如,文件名 st123a.extst123b.ext 将变为相同目录 st123重要提示:此功能需要启用extglob(即shopt -s extglob)。

    【讨论】:

    • 这行得通,谢谢。另外,如果我有两张图片,例如“st123a”和“st123b”,是否也可以将它们移动到名为“st123”的同一个子目录中?
    • 不客气!是的,我编辑了我的答案以包含此行为。
    • 不幸的是,尽管在运行代码之前运行了 shopt -s extglob,但文件 a 和 b 的错误 mkdir: cannot create directory '/home/(..)/folder1/st123a': File existsmv: '/home/(..)/folder1/st123a' and '/home/(..)/folder1/st123a' are the same file
    • 我怀疑您的文件不包含任何扩展名(例如 st123a.jpg )。我说的对吗?
    • 它有一个 .tif 扩展名,但即使在没有扩展名的情况下重命名它,我也遇到了同样的错误
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-09-25
    • 2011-08-07
    • 1970-01-01
    • 1970-01-01
    • 2017-07-31
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多