我有一个包含超过 27000 张图像的目录。
我想将这些文件分成文件夹,每个文件夹包含大约 500 张图像。
它们如何排序并不重要,我只是想将它们分开。
一个“简单”的 find / xargs 就可以了:
find -maxdepth 1 -type f -print0 | xargs -r -0 -P0 -n 500 sh -c 'mkdir newdir.$$; mv "$@" newdir.$$/' xx
解释:
- find
-
-maxdepth 1
防止 find 递归遍历任何目录,安全,如果您知道没有目录则不需要
-
-type f
只查找文件
-
-print0
使用 null char 而不是 LF 分隔文件(以处理奇怪的名称)
- xargs
-
-r
不要使用空参数列表运行
-
-0
读取以 null 分隔的文件
-
-P0
根据需要创建任意数量的进程
-
-n 500
使用 500 个参数运行每个进程
- sh
-
-c
运行作为下一个参数提供的命令行脚本
-
mkdir newdir.$$
创建一个以 shell 进程 PID 结尾的新目录
-
mv "$@" newdir.$$/
将脚本的参数(每个参数都引用)移动到新创建的目录
-
xx
命令行提供的脚本的名称(参见 sh 手册)
请注意,这是not我会在生产中使用的东西,它主要基于以下事实:$$
(pid) 对于 xargs 执行的每个进程来说都是不同的
如果您需要对文件进行排序,您可以抛出sort -z
之间找到一个 xargs。
如果您想要更有意义的目录名称,您可以使用如下所示的名称:
echo 1 >../seq
find -maxdepth 1 -type f -print0 |sort -z | xargs -r -0 -P1 -n 500 sh -c 'read NR <../seq; mkdir newdir.$NR; mv "$@" newdir.$NR/; expr $NR + 1 >../seq' xx
-
echo 1 > ../seq
将第一个目录后缀写入文件中(确保它不在当前目录中)
-
-P1
告诉 xargs 一次运行一个命令以防止竞争情况
-
read NR <../seq
从文件中读取当前目录后缀
-
expr $NR + 1 >../seq
写入下次运行的下一个目录后缀
-
sort -z
对文件进行排序
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)