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

use*_*257 6 unix directory bash gnu mv

我目前有~40k RAW图像,它们是嵌套目录结构.(有些文件夹有多达100个子文件夹,里面装满了文件.)我想将它们全部移动到一个主目录中,没有子文件夹.怎么可以使用mv?我知道-r交换机将递归复制,但这也复制文件夹,我不希望在主文件夹中有子目录.

gni*_*urf 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' -- {} +
Run Code Online (Sandbox Code Playgroud)

如果您不想按扩展名过滤,只需移动所有内容(即所有文件):

find /path/to/photos -type f -exec mv -nv -t '/path/to/master' -- {} +
Run Code Online (Sandbox Code Playgroud)

-n选项是为了不覆盖现有文件(如果你不关心可选)和-v选项,以mv显示它正在做什么(非常可选).

-t选项mv是指定目标目录,这样我们就可以堆叠中的所有文件,在命令结束移动(见+的分隔符-exec).如果您mv不支持-t:

find /path/to/photos \( -iname '*.jpg' -o -iname '*.png' \) -type f -exec mv -nv -- {} '/path/to/master' \;
Run Code Online (Sandbox Code Playgroud)

但这样效率会降低,因为mv将为每个文件创建一个实例.

顺便说一句,这会移动文件,它不会复制它们.

备注.

  • 该目录/path/to/master必须已存在(此命令不会创建该目录).
  • 确保目录/path/to/master 是不是/path/to/photos.这会让事情变得尴尬!