Bash 将图像移动到具有图像文件名的文件夹中

Bash 将图像移动到具有图像文件名的文件夹中,bash,directory,mkdir,Bash,Directory,Mkdir,我有一个名为folder1的文件夹,其中有一组图片,我想将每张图片保存在一个单独的文件夹中。文件夹应与文件同名,例如,如果图片名为“st123”,我想创建一个名为“st123”的文件夹,并将图片移动到文件夹中。我尝试了以下操作,但我发现错误无法移动到其自身的子目录。还有别的办法解决这个问题吗? 否则,是否可以将图像“st123”保存在名为“123”的文件夹中(最后3个字符) 你几乎让它工作了!更改第3行的一部分,使for循环迭代目录中的内容,而不是目录本身: #!/bin/bash Parent

我有一个名为folder1的文件夹,其中有一组图片,我想将每张图片保存在一个单独的文件夹中。文件夹应与文件同名,例如,如果图片名为“st123”,我想创建一个名为“st123”的文件夹,并将图片移动到文件夹中。我尝试了以下操作,但我发现错误无法移动到其自身的子目录。还有别的办法解决这个问题吗? 否则,是否可以将图像“st123”保存在名为“123”的文件夹中(最后3个字符)


你几乎让它工作了!更改第3行的一部分,使for循环迭代目录中的内容,而不是目录本身:

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

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

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

编辑: 根据OP请求,我添加了以下更改:

  • 修剪文件名的后缀
    a
    b
    ,以便,例如,文件名st123a.ext和st123b.ext将转到同一目录st123重要:此功能需要启用(即
    shopt-s extglob

是的,您应该使用find(以及链接中所述的perl!)。我编辑了答案以反映这一点。op没有说明什么类型的图像,*.jpg可能无效,*.jpg,jpg,jpeg,jpg,png,svg,…}仍然可能在不同的图像集中丢失某些内容。千万不要这样做:
对于x在$(command)
`command`
$var
。for in用于迭代参数,而不是(输出)字符串。相反,使用glob(例如
*.txt
)、数组(例如
“${names[@]}”
)或while read循环(例如
while read-r行
)。请参阅,而且,您正在使用
find
-print0
,在这种情况下,它不仅没有用,而且完全错误。这很有效,谢谢。此外,如果我有两张图片,例如“st123a”和“st123b”,是否也可以将它们移动到名为“st123”的同一子目录中?不客气!是的,我编辑了我的答案以包含此行为。不幸的是,我收到的错误是,
mkdir:cannotcreatedirectory'/home/(..)/folder1/st123a':文件存在,
mv:'/home/(..)/folder1/st123a'和'/home/(..)/folder1/st123a'对于文件a和文件b是同一个文件
,尽管在运行代码之前运行了
shopt-s extglob
,但我怀疑您的文件不包含任何扩展名(例如st123a.jpg)。我说的对吗?它有一个.tif扩展名,但即使在没有扩展名的情况下重命名它,我也会遇到同样的错误
for image in /home/me/myfiles/folder1/*; do
    if [[ -f $image ]]; then 
        newf="${image%%?([ab]).*}"
        mkdir -p "$newf"
        mv -- "$image" "$newf"
    fi
done
$ [/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