0

大家好,我对一个表面上看起来应该很简单的过程有点坚持,但我发现它具有挑战性。自从我做了很多 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 ,但似乎无法让它发挥作用。我觉得我在这里错过了一个优雅的解决方案。有什么建议么?

4

1 回答 1

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
于 2013-09-06T03:23:35.583 回答