使用图像文件名将图像移动到文件夹

时间:2016-04-12 21:15:44

标签: bash directory mkdir

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

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

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:1)

此解决方案可能对您有用,但如果您想迭代图片递归,我建议您使用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.ext st123b.ext 转到同一目录 st123 重要:此功能需要启用 extglob (即shopt -s extglob)。