Linux - 如何将位于多个子目录中的相同扩展名的文件复制到单个目录中?

4
我有一个文件夹,其中有许多子目录,每个子目录中都有一个*.nr 文件。有1000个子目录,每个子目录至少包含一个*.nr文件。有没有一种快速的方法将所有这些*.nr文件复制到单个目录中?
如果有一种快速的基于命令行的方法,我可以写一个简单的Python脚本来迭代这些文件,但这似乎有些过度了。
我已经尝试了谷歌搜索,但我不确定我应该搜索哪些确切的术语。
谢谢!

os.walk + shutil.copyfile应该可以解决问题。我猜可能需要使用os.path.splitext进行检查。 - mgilson
3个回答

9

something like

find /path/to/src -name "*.nr" -exec cp \{\} /path/to/dest \;

请记住,这可能会覆盖掉与/path/to/dest相同名称的文件,但这是解决此问题时需要注意的事项。 - chepner

4

如果你的系统上有GNU cp,使用以下命令可以更快地完成:

find /path/to/src -name "*.nr" -print0 | xargs -0 cp -t /path/to/dest


src目录下所有.c文件复制到目标目录:

time find ~/src -name "*.c" -exec cp \{\} ~/src/Cfound/ \;
. . .
real    0m1.838s
user    0m9.530s
sys     0m1.110s

time find . -name "*.c" -print0 | xargs -0 cp -t ./Cfound/
. . .
real    0m0.057s
user    0m0.010s
sys     0m0.060s

我知道使用xargs更快,但我总是记不住正确的语法。在我查阅man xargs的时间里,我可以敲出find -exec命令 :)但是为你的基准测试努力点赞! - Paul Dixon
谢谢,顺便问一下,你在exec中为什么要转义{}而不是使用引号? - OregonTrail

0
在Bash中最简单的方法是:
for F in */*.nr; do cp $F otherdir/ ; done

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接