Shell

以隨機順序對文件夾中的每個文件執行命令

  • September 27, 2016

我想為文件夾中的每個文件執行一個命令,但是是隨機的。就像是:

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

但每次都以另一個順序。這最接近我的需要,但是 1)它不起作用,2)順序是隨機的,但總是相同的:

find . -type f -print0 | sort -Rz | xargs -0 <command>
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

這適用於可以採用多個參數的命令,例如md5sumor 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>

獎勵:您還可以find -exec通過xargs關閉-execwith\+而不是\;

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

引用自:https://unix.stackexchange.com/questions/305971