xargsのオプション

今までxargsは標準入力を常に最後の引数として展開するものとばかり思っていた。が、manを見てみると

--replace[=replace-str], -i[replace-str]
initial arguments の中の replace-str を、標準入力から読んだ名前で置き換える。クォートされていない空白文字を文字列の区切りとみなさない。 replace-str が省略された場合は、 "{}" がデフォルトの置換文字となる (`find -exec' と同様)。自動的に -x と -l 1 が同時に指定されたことになる。

なるオプションが存在した。よって今までは

for fn1 in 0 1 2 3 4 5 6 7 8 9 A B C D E F
do
 for fn2 in 0 1 2 3 4 5 6 7 8 9 A B C D E F
 do
  mkdir ${fn1}${fn2}
  find ./ -name ${fn1}${fn2}\*.\* -exec mv {} ${fn1}${fn2}/ \;
 done
done

としていたのを

for fn1 in 0 1 2 3 4 5 6 7 8 9 A B C D E F
do
 for fn2 in 0 1 2 3 4 5 6 7 8 9 A B C D E F
 do
  mkdir ${fn1}${fn2}
  find ./ -name ${fn1}${fn2}\*.\* -print0 | xargs -0 --replace mv {} ${fn1}${fn2}/
 done
done

とできる。今回の場合は後者のほうが明らかに早かった。