7

我目前有大约 40k RAW 图像,它们位于嵌套目录结构中。(有些文件夹有多达 100 个充满文件的子文件夹。)我想将它们全部移动到一个主目录中,没有子文件夹。这怎么能用 来完成mv?我知道-r交换机会递归复制,但这也会复制文件夹,我不希望在主文件夹中有子目录。

4

4 回答 4

15

如果您的照片在/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选项 tomv是指定目标目录,这样我们就可以在命令末尾堆叠所有要移动的文件(见 的分隔+-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会让事情变得尴尬!
于 2013-11-09T18:12:09.550 回答
1

使用以下-execdir选项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使得find从每个目录执行给定的命令,因此只有基本文件名被移动,而没有文件的任何父路径。

于 2013-11-09T18:11:37.087 回答
0
find <base location of files> -type -f -name \*\.raw -exec mv {} master \;
于 2013-11-09T18:11:55.033 回答
0

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

mv -a firstfolder/firstfile.raw firstfile.raw

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

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

于 2014-01-27T15:16:57.117 回答