Bash 使用mv仅将文件从多个目录递归地移动到一个目录中

Bash 使用mv仅将文件从多个目录递归地移动到一个目录中,bash,unix,gnu,directory,mv,Bash,Unix,Gnu,Directory,Mv,我目前有大约40k个原始图像,它们位于嵌套目录结构中。(有些文件夹有多达100个子文件夹,其中充满了文件。)我想将它们全部移动到一个主目录中,而不包含任何子文件夹。如何使用mv实现这一点?我知道-r开关将递归复制,但这也会复制文件夹,我不希望主文件夹中有子目录 使用查找的-execdir选项: find /path/of/images -type f -execdir mv '{}' /master-dir \; 根据人工查找: -execdir utility [argument ...]

我目前有大约40k个原始图像,它们位于嵌套目录结构中。(有些文件夹有多达100个子文件夹,其中充满了文件。)我想将它们全部移动到一个主目录中,而不包含任何子文件夹。如何使用
mv
实现这一点?我知道
-r
开关将递归复制,但这也会复制文件夹,我不希望主文件夹中有子目录

使用
查找
-execdir
选项:

find /path/of/images -type f -execdir mv '{}' /master-dir \;
根据
人工查找

 -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
从每个目录执行给定的命令,因此只移动基本文件名,而不移动文件的任何父路径。

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

如果您的照片位于
/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' -- {} +
如果不想按扩展名筛选,只需移动所有内容(即所有文件):

-n
选项以避免覆盖现有文件(如果您不介意,可以选择)和
-v
选项以
mv
显示它正在执行的操作(非常可选)

-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
    中。这会让事情变得尴尬
如果您的层次结构只有一个层次,下面是使用以下自动化工具的另一种方法:

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


免责声明:出于学术目的,我是这部作品的合著者,正在开发bash脚本渲染器。但是系统已经可以用于测试目的了。

哦,天哪,如果当前目录中有扩展名为
.raw
的文件,那么这将非常失败。请使用更多的报价<代码>'*.raw'就足够了!对。只是一个偏好。我不确定这里的
execdir
是强制性的。。。我甚至不确定这是否完全符合您的要求(它还将移动子目录)。这是一个非常混乱的命令
:D
@gniourf\u gniourf:请测试它。检查
查找之间的差异-execdir echo'{}\
查找-执行回显'{}'\输出,您将认识到
-execdir
在这里是多么方便。
mkdir-pv anubhava/subdir{1,2}/subsubdir{1,2}master;触摸anubhava/subdir{1,2}/subsubdir{1,2}/file;查找anubhava-execdir mv{}master\哦,天哪,它没有按预期工作!别担心我,我完全知道
-execdir
做什么
;)。太棒了!这正是我需要的。
find /path/to/photos \( -iname '*.jpg' -o -iname '*.png' \) -type f -exec mv -nv -- {} '/path/to/master' \;
mv -a firstfolder/firstfile.raw firstfile.raw