4

在一个目录中,我有许多子目录,每个子目录都有许多不同类型的文件。我想从每个子目录中提取具有特定扩展名的所有文件并将其放在不同的文件夹中。是否可以编写一个 bash 脚本来执行此操作?如果有怎么办?

4

4 回答 4

10
$ find <directory> -name '*.foo' -exec mv '{}' <other_directory> \;

find通过目录结构进行递归搜索,并对它找到的与搜索条件匹配的任何文件执行给定的操作。

在这种情况下,-name '*.foo'是搜索条件,并-exec mv '{}' <other_directory> \;告诉在它找到的任何文件find执行 ,其中转换为文件名并表示命令的结尾。mv'{}'\;

于 2012-07-10T16:37:55.660 回答
7

如果你有 bash v4 并且有

shopt -s globstar

在您的 .profile 中,您可以使用:

mv ./sourcedir/**/*.ext ./targetdir
于 2012-07-10T17:00:53.140 回答
2

使用 find 和一个简单的 while 循环就可以了:

find directory -name '*.foo'|while read file; do
    mv $file other_directory/
done

在这里它将所有带有.foo后缀的文件移动到 other_directory/

于 2012-07-10T16:35:23.087 回答
1

您可以使用findxargs来减少循环或多次调用mv的需要。

find /path/to/files -type f -iname \*foo -print0 |
    xargs -0 -I{} mv {} /path/to/other/dir
于 2012-07-10T16:42:17.370 回答