我想对文件夹中的每个文件执行一个命令,但随机。就像是:
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> '{}' \+