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

时间:2013-11-09 18:04:20

标签: bash unix gnu directory mv

我目前有~40k RAW图像,它们位于嵌套目录结构中。 (有些文件夹有多达100个子文件夹,里面装满了文件。)我想将它们全部移动到一个主目录中,没有子文件夹。如何使用mv完成此操作?我知道-r开关将递归复制,但这也会复制文件夹,我不希望在主文件夹中有子目录。

4 个答案:

答案 0 :(得分:14)

如果您的照片位于/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显示正在执行的操作(非常可选)。< / p>

-t的{​​{1}}选项是指定目标目录,以便我们可以在命令末尾堆叠要移动的所有文件(参见mv分隔符+)。如果您的-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 不是。这会让事情变得尴尬!

答案 1 :(得分:1)

使用-execdir的{​​{1}}选项:

find

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

答案 2 :(得分:0)

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

答案 3 :(得分:0)

如果您的层次结构只有一层,那么使用StringSolver的自动化工具是另一种方式:

mv -a firstfolder/firstfile.raw firstfile.raw

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

免责声明:我是这项工作的合着者,出于学术目的,并致力于bash脚本渲染器。但该系统已经可用于测试目的。