我目前有大约40k张RAW图像,它们位于一个嵌套的目录结构中。(一些文件夹里有多达100个子文件夹充满了文件。)我想将它们全部移动到一个主目录中,没有子文件夹。如何使用mv
命令完成这个任务?我知道-r
选项可以递归复制,但这会复制文件夹,并且我不希望在主文件夹中有子文件夹。
/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
中。否则会变得很尴尬!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_gniourffind . -execdir echo '{}' \;
和 find . -exec echo '{}' \;
的输出差异,你会意识到 -execdir
在这里是多么方便。 - anubhava-type f
!!!你看我说它不起作用时是对的吧?你必须编辑你的帖子,这样我才能取消踩。 (顺便说一句,-execdir
是无用的,只使用-exec
也可以。) - gniourf_gniourfmv -a firstfolder/firstfile.raw firstfile.raw
-a
选项会立即将相似的转换应用于所有嵌套级别为1的相似文件(即所有其他子文件夹)。
如果您不信任系统,可以使用其他选项,例如-e
来解释转换或-t
在所有文件上进行测试。
免责声明:我是这项学术工作的共同作者,并正在开发一个bash脚本渲染器。但该系统已经可供测试。
find <base location of files> -type -f -name \*\.raw -exec mv {} master \;
.raw
的文件,这将彻底失败。请使用更多引号! - gniourf_gniourf