find+xargsのよくある処理で空白を含む名前のファイルを扱う

はじめに

findxargsを使って、複数ファイルをまとめて処理するのはよくやると思います。

が、とくにオプションとか考えずにやると空白混じりのファイル名があった時に、エラーで怒られます。

space_files $ ls -la
total 24
drwxr-xr-x   5 sumida  staff   170  2 25 18:26 .
drwxr-xr-x  52 sumida  staff  1768  2 25 18:18 ..
-rw-r--r--   1 sumida  staff   331  2 25 18:24 hoge 1.txt
-rw-r--r--   1 sumida  staff   515  2 25 18:24 hoge2.txt
-rw-r--r--   1 sumida  staff   689  2 25 18:26 hoge3.txt
space_files $ find . -type f|xargs wc -l
wc: ./hoge: open: No such file or directory
wc: 1.txt: open: No such file or directory
      13 ./hoge2.txt
      25 ./hoge3.txt
      38 total
space_files $

これは、xargsが空白文字を区切り文字として使用するためです。

上の例だと、wc -l hoge 1.txtとなることを期待していますが、実際にはwc -l hogewc -l 1.txtに分割されてしまい、そんなファイルはないので怒られます。

解決策

find-print0オプションとxargs-0オプションを指定すれば解決。

space_files $ find . -type f -print0 |xargs -0 wc -l
       8 ./hoge 1.txt
      13 ./hoge2.txt
      25 ./hoge3.txt
      46 total
space_files $

このオプションは、二つとも区切り文字をヌル文字にするオプションなので、空白が含まれていても1つのファイル名として扱ってくれます。