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