このエントリーをはてなブックマークに追加


空白を含むファイル名のファイルをfindとxargsの組み合わせで処理する方法

スペースを含むファイル名のファイルをfind, xargsを使用して処理する方法を以下に記します。


関連記事

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の -print0 オプション、xargsの -0 オプション

このような場合には、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の組み合わせで処理する方法についてでした。



トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2016-11-02 (水) 09:47:59