Bluepostech

プログラムとかはこっち

【Linux】findで特殊文字をエスケープする

findという非常に便利なコマンドがある。これはファイルを検索するコマンドなので、よくパイプと一緒に使う。

たとえば、カレントディレクトリ以下のemacsで生成される「*.txt~」というような一時ファイルを一挙に削除するときは次のようにすればよい。

find ./ -name "*~" | xargs -i rm -vrf {}

このコマンドの解説は、検索すれば大量にヒットするのでどこかにゆずるとする。

ところが、このコマンドでは、「I'm lovin' it.mp3」のようなファイル名にクオートが含まれるファイルを処理できない。普通にプログラミングをやっているときはこういうことがあるのでタイトルに特殊文字を使うことは避けるべきなのだが、たとえばmp3プレーヤーにコピペするとコピーされてしまう「desktop.ini」をfindで削除するときなどに困る。

このとき、xargsの0オプションを使う。これはデフォルトでは改行で区切られるものをヌル文字という特殊な制御文字で区切るものだ。また、0オプションを使うとタイトル中の特殊文字をエスケープすることができる。

このとき、パイプで渡すもととなるfindの出力も変更しないといけないが、findはxargsと一緒に使うことが多いだけにそのためのオプション「-print0」が用意されている。よって、まとめると次のようになる。

find ./ -name "*.ini" -print0 | xargs -0 rm -vrf {}