我目前有~40k RAW图像,它们位于嵌套目录结构中。 (有些文件夹有多达100个子文件夹,里面装满了文件。)我想将它们全部移动到一个主目录中,没有子文件夹。如何使用mv
完成此操作?我知道-r
开关将递归复制,但这也会复制文件夹,我不希望在主文件夹中有子目录。
答案 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脚本渲染器。但该系统已经可用于测试目的。