以随机顺序对文件夹中的每个文件执行命令

以随机顺序对文件夹中的每个文件执行命令

我想对文件夹中的每个文件执行一个命令,但随机。就像是:

find . -type f -exec <command> '{}' \;

但每次都是以不同的顺序。这最接近我的需求,但是1)它不起作用,2)顺序是随机的,但总是相同的:

find . -type f -print0 | sort -Rz | xargs -0 <command>

答案1

find . -type f -exec <command> '{}' \;

不等于

find . -type f | xargs <command>

观察:

$ find -type f
./b
./c
./e
./d
./a
$ find -type f -exec echo '{}' \;
./b
./c
./e
./d
./a
$ find -type f | xargs echo
./b ./c ./e ./d ./a

xargs收集一堆达到给定长度的参数,然后立即使用所有参数执行命令。

这是执行的内容find -type f -exec echo '{}' \;

echo ./b
echo ./c
echo ./e
echo ./d
echo ./a

这是执行的内容find -type f | xargs echo

echo ./b ./c ./e ./d ./a

md5sum这对于可以采用多个参数(例如或 )的命令非常有效file。但不适用于一次只接受一个参数的命令。

为了使xargs行为更像find -exec你可以添加-n1参数xargs

$ find -type f | xargs -n1 echo
./b
./c
./e
./d
./a

-n1告诉xargs为每个参数执行一个命令1

在您的示例命令中:

find . -type f -print0 | sort -Rz | xargs -0 -n1 <command>

奖励:您还可以通过关闭with而不是来使find -exec行为更像:xargs-exec\+\;

find -type f -exec <command> '{}' \+

相关内容