使用mv命令将多个目录中的文件递归地移动到一个目录中

8

我目前有大约40k张RAW图像,它们位于一个嵌套的目录结构中。(一些文件夹里有多达100个子文件夹充满了文件。)我想将它们全部移动到一个主目录中,没有子文件夹。如何使用mv命令完成这个任务?我知道-r选项可以递归复制,但这会复制文件夹,并且我不希望在主文件夹中有子文件夹。

4个回答

16
如果您的照片在 /path/to/photos/ 及其子目录中,并且您想将它们移动到 /path/to/master/,并且您想通过扩展名 .jpg.JPG.png.PNG 等进行选择:
find /path/to/photos \( -iname '*.jpg' -o -iname '*.png' \) -type f -exec mv -nv -t '/path/to/master' -- {} +

如果您不想按扩展名进行过滤,而只是移动所有文件,则可以这样操作:

find /path/to/photos -type f -exec mv -nv -t '/path/to/master' -- {} +
-n选项是为了不覆盖现有文件(如果您不在意,可以选择不加),-v选项是为了让mv显示它正在做什么(非常可选)。 -t选项用于指定目标目录,这样我们就可以将所有要移动的文件堆叠到命令末尾(请参见-exec+分隔符)。如果您的mv不支持-t
find /path/to/photos \( -iname '*.jpg' -o -iname '*.png' \) -type f -exec mv -nv -- {} '/path/to/master' \;

但这种方法的效率较低,因为每个文件都会创建一个mv实例。

顺便说一句,这将移动文件,而不是复制它们。

备注。

  • 目录/path/to/master必须已经存在(此命令不会创建该目录)。
  • 确保目录/path/to/master不在/path/to/photos中。否则会变得很尴尬!

太棒了!完全符合我的需求。 - user1067257

1
利用find命令的-execdir选项:
find /path/of/images -type f -execdir mv '{}' /master-dir \;

根据man find的说明:
 -execdir utility [argument ...] ;
     The -execdir primary is identical to the -exec primary with the exception that 
     utility will be executed from the directory that holds the current
     file.  The filename substituted for the string ``{}'' is not qualified.

-execdir 使得 find 命令在每个目录中执行给定的命令,因此只移动基础文件名,不包含文件的任何父路径。


我不确定这里是否必须使用execdir...而且我也不确定这个命令是否完全符合您的要求(它还会移动子目录)。这是一个非常混乱的命令:D - gniourf_gniourf
@gniourf_gniourf:请测试一下。 - anubhava
检查 find . -execdir echo '{}' \;find . -exec echo '{}' \; 的输出差异,你会意识到 -execdir 在这里是多么方便。 - anubhava
你的命令根本不起作用,所以我给你点了踩。我试图向你解释,但你不愿意听。 - gniourf_gniourf
啊,你加了-type f!!!你看我说它不起作用时是对的吧?你必须编辑你的帖子,这样我才能取消踩。 (顺便说一句,-execdir是无用的,只使用-exec也可以。) - gniourf_gniourf
显示剩余10条评论

0
如果您的层次结构只有一层深度,这里有另一种使用StringSolver自动化工具的方法:
mv -a firstfolder/firstfile.raw firstfile.raw

-a选项会立即将相似的转换应用于所有嵌套级别为1的相似文件(即所有其他子文件夹)。 如果您不信任系统,可以使用其他选项,例如-e来解释转换或-t在所有文件上进行测试。

免责声明:我是这项学术工作的共同作者,并正在开发一个bash脚本渲染器。但该系统已经可供测试。


0
find <base location of files> -type -f -name \*\.raw -exec mv {} master \;

哦,如果当前目录中有扩展名为.raw的文件,这将彻底失败。请使用更多引号! - gniourf_gniourf
“*.raw”就足够了! - gniourf_gniourf
返回翻译的文本:true(只是一个偏好)。 - WhyteWolf

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