使用 shuf 和 mv 移动随机文件 - 参数列表太长

使用 shuf 和 mv 移动随机文件 - 参数列表太长

我有一个包含近 250K 文件的目录,文件很多,我想将 x 个随机文件移动到另一个目录。

我搜索并得到了使用shufmv命令的解决方案这里这里,所以基本上我正在使用这个命令

$ shuf -n 5533 -e trainB/* | xargs -i mv {} testB/

但我收到此错误:

bash: /usr/bin/shuf: Argument list too long

我相信由于文件数量很大,因此参数列表太长,还有其他方法可以做到这一点吗?

我在 SLES12 SP2 上运行。

答案1

由于您使用的是 SLES,因此可以使用 GNU 扩展来使其更安全:

find trainB -mindepth 1 -maxdepth 1 ! -name '.*' -print0 |
  shuf -n 5533 -z |
  xargs -r0 mv -t testB

这用于find处理文件列表通过管道而不是命令行参数,然后对它们进行洗牌,限制输出,最后将它们移动到testB. 、和选项确保使用 nul 终止符而不是换行符-print0-z-0

您可以使用以下代替find

printf '%s\0' trainB/*

printf由于是内置的bash,因此不受此影响arg 列表太长系统调用的限制execve()。但这可能效率较低,因为 shell 需要构建整个列表并对其进行排序,同时find显示未排序的文件路径。

相关内容