スポンサーリンク

2 件 見つかりました。

1. [2010-07-03-1]

UNIX findコマンドでスペースを含むファイル名を操作する[unix][find][xargs]

UNIXでfindコマンドの出力をxargsにつないで、ファイル操作をすることがよくあると思います。個人的には、Unixでファイルやディレクトリを作成するときにファイル名やディレクトリ名にスペースを入れることはありませんが、そういったファイルを配布されることもごくまれにあるかもしれません。findコマンドで見つかったスペース入りのファイル名を操作したいときは、 -print0 オプションと xargs の -0 オプションを組み合わせることで、処理することができます。find /foo/bar -name '* *.txt' -print0 | xargs -0 rm詳細については、下記ページを見てください。[2008-12-08-1]上記の find + xargs の組み合わせで、十分ことが足りるわけですが、2つもプロセスを起動しなければならないとか、コマンドが受け取れる引数の限界の問題がくるかもしれないので、find単体で処理できるなら、findコマンドだけで処理したらいいんじゃないの?と思います。そこで出てくるのが、 -exec オプションです。find /foo/bar -name '* *.txt' -exec rm {} \;いろいろな事がそうですが、Unixのコマンドラインも答えは1つではなく、様々な組み合わせで目的を実現することができます。
2. [2008-12-08-1]

UNIX findとxargsコマンドで-print0オプションを使う理由[unix][find][xargs]

このドキュメントの内容は、以下の通りです。概要findとxargsを組み合わせて失敗する例スペースが含まれるファイル名をうまく扱う方法まとめ概要2018-05-03に ページのタイトルはそのままですが、「真 UNIX findとxargsコマンドで-print0オプションを使う理由」として記事をアップデート致しました。UNIXでファイルを検索する方法としてfindlocate などがあります。Unix の find コマンドにはいろいろなオプションがあり、パワフルな検索機能を提供してくれます。find の exec を使えば、ほかのコマンドを連携できますが、 UNIXでfindコマンドをパイプでxargsとつなぐこともよくあります。find . -name '*.txt' | xargs ls上記のケースだと問題になることがあります。それはどんなケースかというと、ファイル名にスペースが含まれるときです。例えば、こんな名前だったらread me.txtread と me.txt として xargs が扱ってしまいます。echo と xargs でやってみると$ echo 'read me.txt' | xargs -n1 echoreadme.txtこんな感じになります。上記の問題がおきるケースでの解決策を先に示しておくと、以下の-print0や-0オプションを使うことになります。find . -name '*.txt' -print0 | xargs -0 lsこの謎のオプション達(-print0と-0)については、後述します。findとxargsを組み合わせて失敗する例失敗する例を示してみます。ファイル名にスペースが含まれたファイルを作成し、findの結果をxargsに渡して、lsを実行させます。mkdir tmpcd tmptouch 'abc def.txt'find . -name '*.txt' | xargs lsls: ./abc: No such file or directoryls: def.txt: No such file or directorylsコマンドの結果からわかるように、スペースが含まれるファイル名は、別々なものとして認識されています。この問題は、xargsが区切り文字(デミリタ, delimiter) としてスペースを使っているからです。xargsは、デミリタとして、スペース、タブ、改行です。スペースが含まれるファイル名をうまく扱う方法この問題を回避するためには、区切り文字をスペース以外のものにする必要があります。findコマンドでは、-print0というオプションが用意されています。-print0オプションを有効にすると区切り文字がスペースから \0 (ヌル文字)に変更されます。xargsコマンドは、-0オプションを指定されると \0 を区切り文字(デミリタ)として扱います。\0 (ヌル文字)は、C言語で文字列の終端に使われているものです。findの-print0オプションとxargsの-0オプションを有効にした結果です。find . -name '*.txt' -print0 | xargs -0 ls./abc def.txt-0 オプションは、 --null という別名も持っています。まとめfind からパイプで xargs につなぐ場合には、ファイル名にスペース(スペース、タブ)が含まれている場合には、 find に -print0 オプションを指定し、 xargs に -0 オプションを指定することで、スペースが含まれるファイル名を正しくハンドルできます。
スポンサーリンク