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

2024-04-27

我有一个包含超过 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(使用前将#替换为@)

如何将一个目录中的所有文件移动到多个具有给定文件数量的目录中? 的相关文章

  • bash 别名中允许使用哪些字符[关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我最近添加了 alias cd alias cd alias cd 到我的 bash aliases 文件 玩弄这个 我注意到在别名时 被
  • Gradle 环境变量。从文件加载

    我是 Gradle 新手 目前我有这个任务 task fooTask doLast exec environment FOO KEY 1234567 Load from file here commandLine fooScript sh
  • 如何替换带引号的多单词字符串作为参数?

    我正在尝试替换包含多个带引号的单词的字符串变量作为命令的参数 因此 给出以下示例脚本 请注意 shebang 中的 x 这会导致输出被记录到 stderr bin bash x myArg hello world echo string i
  • 使用 GitHub 时防止将大文本文件添加到提交

    我们想要防止 非常大的文本文件 每个文件 gt 50MB 被提交到git代替git lfs 因为它们夸大了 git 历史 问题是 其中 99 大小差异的原因 这些是 YAML 文件 它们支持通过 Base64 编码进行二进制序列化 我们无法
  • 将 sudo 与 Python 脚本结合使用

    我正在尝试编写一个小脚本来在每次执行脚本时安装 VirtualBox 共享文件夹 我想用Python 来做这件事 因为我正在尝试学习它来编写脚本 问题是我需要特权才能启动挂载命令 我可以将脚本作为 sudo 运行 但我更喜欢它自己创建 su
  • 命令行参数中的“-”(破折号)有什么魔力?

    例子 创建 ISO 映像并将其直接刻录到 CD mkisofs V Photos r home vivek photos cdrecord v dev dev dvdrw 更改到上一个目录 cd 侦听端口 12345 并解压发送到该端口的数
  • 如何在 Bash 中将字符串转换为小写

    有办法进去吗bash questions tagged bash将字符串转换为小写字符串 例如 如果我有 a Hi all 我想将其转换为 hi all 有多种方法 POSIX标准 https en m wikipedia org wiki
  • 寻找下一个开放端口

    有没有什么办法 使用基本的 Unix 命令 找到下一个未使用的端口号 从端口 4444 开始向上 我通过 ssh 通过 openssh 进入 Windows XP 计算机 运行 Cygwin 工具并使用 bash shell 谢谢 戴夫 尝
  • Linux shell 命令逐块读取/打印文件

    是否有一个标准的 Linux 命令可以用来逐块读取文件 例如 我有一个大小为 6kB 的文件 我想读取 打印第一个 1kB 然后是第二个 1kB 看来猫 头 尾在这种情况下不起作用 非常感谢 你可以这样做read n在循环中 while r
  • bash、zsh :声明 [*] (天哪)

    我正在使用具有以下语法的 bash 脚本 declare a THIS 这在 zsh 中似乎是非法的 我收到 未找到匹配项 THIS 错误 谁能帮我把它翻译成 zsh 吗 另外 什么是 语法是什么意思 我知道我们正在声明一个数组 但为什么要
  • 当我通过 shell 脚本创建 .txt 文件时,为什么文件名末尾出现问号? [复制]

    这个问题在这里已经有答案了 我正在编写一个 shell 脚本 我应该在其中创建 1 个文本文件 当我这样做时 文件名末尾出现一个问号 是什么原因 我正在 bash 脚本中尝试以下方法 1 grep ERROR a1 gt text txt
  • 如何在Windows Git shell中运行./script.sh?

    也许这很尴尬 但是当我在 Git shell 中工作时 我无法在 Windows 上运行 sh 文件 也许我必须安装一些东西 但我认为 Git 会支持 bash 命令 我知道 Windows 不使用 sh 文件 我正在执行安装步骤游戏结束
  • Bash 中 $() 和 () 之间的区别

    当我打字时ls l echo file 支架的输出 这只是简单的回显 被获取并传递到外部ls l命令 就等于简单的ls l file 当我打字时ls l echo file 我们有错误 因为不能嵌套 内部外部命令 有人可以帮助我理解之间的区
  • 按行号和列号对文件进行子集化

    我们想要按行和列对文本文件进行子集化 其中行数和列数是从文件中读取的 不包括标题 第 1 行 和行名称 第 1 列 输入文件 txt制表符分隔的文本文件 header 62 9 3 54 6 1 25 1 2 3 4 5 6 96 1 1
  • 使用 sed 将 old-link-url 替换为 new-link-url

    我正在 bash 中编写一个脚本 将 old link url 替换为 new link url 我的问题是 sed 由于斜杠而无法替换 url 如果我只输入一些文字就可以了 my code sed e s old link new lin
  • 在 Ubuntu 上纯粹通过 bash 脚本安装 mysql 5.7

    我想要一个无需任何手动输入即可安装 MySQL 5 7 实例的 bash 脚本 我正在关注数字海洋教程 https www digitalocean com community tutorials how to install mysql
  • ANSI 转义码在行尾有奇怪的行为

    重现步骤 考虑以下 shell 命令 echo e e 41mTest nTest2 e 0mTest3 它打印Test并在下一行中Test2具有红色背景 使用 ANSI 转义码 Test2后面直接是Test3这是无色的 行为 第一次执行此
  • IFS 分隔一个字符串,如“Hello”,“World”,“this”,“is,一个无聊”,“line”

    我正在尝试解析 csv 文件 但 IFS 遇到一些问题 该文件包含如下行 Hello World this is a boring line 各列用逗号分隔 因此我尝试使用以下代码分解该行 IFS read r a tempArr lt l
  • 通过 SSH 将变量传递给远程脚本

    我正在通过 SSH 从本地服务器在远程服务器上运行脚本 首先使用 SCP 复制该脚本 然后在传递一些参数时调用该脚本 如下所示 scp path to script server example org another path ssh s
  • bash 函数保留制表符补全

    我把函数 make color make 1 ccze A in bashrc获得彩色的 make 输出 他的作品很好 但是make用于选择目标的制表符补全功能丢失 有什么方法可以保留函数中命令的制表符完成 或者我可以做其他事情来实现制表符

随机推荐