スペースを含むファイル名のファイルをfind, xargsを使用して処理する方法を以下に記します。
findコマンドとxargsコマンドの組み合わせで、複数のファイルをまとめて処理することはLinuxでのファイル処理の基本です。
以下のコマンドはuser0のホームディレクトリのすべてのテキストファイルの行数を数えています。
% find /home/user0 -name \*.txt -print | xargs wc -l 29 /home/user0/hoge.txt 15 /home/user0/gere.txt 44 合計 %
しかし、以下のようにファイル名に空白を含むものがあった場合、このコマンドは失敗します。
findとxargsは空白を複数ファイルのリストの区切りとして扱っているために、
空白を含むファイルの受け渡しに失敗するのです。
% ls -l /home/user0/*.txt -rw-rw-r-- 1 user0 user0 552 8月 1 20:13 /home/user0/gere.txt -rw-rw-r-- 1 user0 user0 1300 8月 1 20:13 /home/user0/hoge hoge.txt % % find /home/user0 -name \*.txt -print | xargs wc -l wc: /home/user0/hoge: そのようなファイルやディレクトリはありません wc: hoge.txt: そのようなファイルやディレクトリはありません 15 /home/user0/gere.txt 15 合計 %
このような場合には、findの-printオプションの代りに、-print0オプションを使い、xargsには-0オプションを追加します。
% find /home/user0 -name \*.txt -print0 | xargs -0 wc -l 29 /home/user0/hoge hoge.txt 15 /home/user0/gere.txt 44 合計 %
このオプションを使用すると、ファイルのリストの区切り文字に空白ではなく\\0(ヌル文字)という制御文字を使用します。
これにより空白を含むファイル名も正常に扱うことができます。
もちろん、このオプションを使って通常のファイル(空白を含んでいないファイル名のファイル)を対象とした処理を行っても、問題は生じません。
以上、空白を含むファイルをfindとxargsの組み合わせで処理する方法についてでした。