gpt4 book ai didi

bash - 如何将一个目录的所有文件移动到具有给定文件数的多个目录中?

转载 作者:行者123 更新时间:2023-11-29 08:59:00 24 4
gpt4 key购买 nike

我有一个包含 27000 多张图片的目录。

我想将这些文件拆分到文件夹中,每个文件夹包含大约 500 张图像。

不管怎么排序,我只想把它们分开。

最佳答案

一个“简单”的 find/xargs 就可以了:

find -maxdepth 1 -type f -print0 | xargs -r -0 -P0 -n 500 sh -c 'mkdir newdir.$$; mv "$@" newdir.$$/' xx

解释:

  • 找到
    • -maxdepth 1防止 find 递归遍历任何目录,安全,如果你知道你没有目录则不需要
    • -type f只查找文件
    • -print0使用空字符而不是 LF 分隔文件(以处理奇怪的名称)
  • xargs
    • -r不要使用空参数列表运行
    • -0读取以 null 分隔的文件
    • -P0根据需要创建尽可能多的流程
    • -n 500使用 500 个参数运行每个进程
    • -c运行作为下一个参数提供的命令行脚本
    • mkdir newdir.$$创建一个以 shell 进程 PID 结尾的新目录
    • mv "$@" newdir.$$/将脚本的参数(每个都引用)移动到新创建的目录
    • xx命令行提供脚本的名称(参见 sh 手册)

请注意,这不是我会在生产中使用的东西,它主要基于以下事实:$$ (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对文件进行排序

关于bash - 如何将一个目录的所有文件移动到具有给定文件数的多个目录中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9082372/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com