答案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
显示未排序的文件路径。