我有一个名为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
答案 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请求,我添加了以下更改:
a
或b
,以便例如文件名 st123a.ext 和 st123b.ext 转到同一目录 st123 。 重要:此功能需要启用 extglob (即shopt -s extglob
)。