大家好,我有点陷入一个过程,表面看起来应该很简单,但我发现它具有挑战性。已经有一段时间了,因为我做了很多bash脚本,所以也许我只是生锈了。
我正在尝试遍历目录树,并根据文件的扩展名将文件排序到不同的子目录中。在每个子目录中,我有一系列图像文件,我想将所有具有.RAW扩展名的文件移动到名为RAW的新子目录中(如果它不存在则创建它)并将剩余文件保留在原来的位置。哦,是的,一些文件夹和文件名包含空格只是为了让生活更有趣。
基本操作:
循环遍历子目录
在每个子目录中
检查扩展名为.RAW的文件是否存在
如果是,则创建一个名为RAW的新目录,并将所有匹配的文件移到那里
这是一个澄清的例子
Dir1
|--subdir 1
| |--file1.jpg
| |--file2.jpg
| |--file3.RAW
| |--file4.RAW
|
|--subdir 2
| |--file1.jpg
| |--file2.jpg
| |--file3.RAW
| |--file4.RAW
我想要的结果是:
Dir1
|--subdir 1
| |--RAW
| | |--file3.RAW
| | |--file4.RAW
| |
| |--file1.jpg
| |--file2.jpg
|
|--subdir 2
| |--RAW
| | |--file3.RAW
| | |--file4.RAW
| |
| |--file1.jpg
| |--file2.jpg
我开始尝试使用像
这样的循环for dir in */ do cd $dir; mkdir RAW; for files in *.RAW do mv $files ./RAW; done; done
这并不是我想要的,但它并不能很好地与名字中的空格搭配。 我已经和find一起玩了很多,但似乎无法让它发挥作用。我觉得我在这里错过了一个优雅的解决方案。有什么建议吗?
答案 0 :(得分:1)
尝试此命令:
#!/bin/bash
find Dir1 -mindepth 1 -type f -name '*.RAW' | while read -r FILE; do
DIRNAME=${FILE%/*}
mkdir -p "$DIRNAME/RAW" && mv "$FILE" "$DIRNAME/RAW/"
done