Bash 使用mv仅将文件从多个目录递归地移动到一个目录中
我目前有大约40k个原始图像,它们位于嵌套目录结构中。(有些文件夹有多达100个子文件夹,其中充满了文件。)我想将它们全部移动到一个主目录中,而不包含任何子文件夹。如何使用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 ...]
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