2013-09-01findとxargsは、手作業ならうんざりするような作業であっても、コマンドライン一発で済ませられる可能性を秘めている。このエントリーではfindとxargsの基本的な使い方をtipsとしてまとめる。findによる検索findはあるディレクトリ以下の条件にマッチしたパスを検索し一覧を出力するコマンドだ。最初の引数には検索対象のパスを与える。以下の例ではカレントディレクトリ以下のファイルとディレクトリが一覧される。.findに条件を与えれば、条件にマッチしたパスのみ出力させることができる。条件には色々書くことができるが、一番良く使われるのは-nameによる名前の指定だろう。名前の指定にはワイルドカードを使う。以下の例は.rbで終わるパスのみを出力させる。"*.rb"名前の指定に正規表現を使いたい場合は-regexオプションだ。".*\\.rb$"ちなみに-nameと-regexには、大文字と小文字の違いを無視するそれぞれ-inameと-iregexも用意されている。条件は複数指定できる。f複数の条件を指定した場合は、すべての条件を満たしたパスのみ出力される。これはAND検索と言える。条件のうち、いずれかを満たしたパスを出力させるOR検索には-orを使う。検索されたパスを眺めるだけでもfindは十分に便利だが、findの真髄はマッチしたパスに対するコマンドの実行にある。マッチしたパスにコマンドを実行するには-execオプションを使う。chmodでパーミッションをすべて600にして、所有者だけが読み書きできるようにしてみよう。\;{}はマッチしたパスに置換されるプレースホルダーの役目をする記号で、マッチしたパスの回数だけchmodコマンドが実行される。末尾の\によるエスケープが煩わしいが、;がシェルに解釈されないようにするために必要だ。findとxargsxargsは標準入力から一覧を受け取って、それを引数に任意のコマンドを実行するコマンドだ。良くfindとセットで使われる。-execと同様だが、一番の違いはxargsは複数行をまとめてコマンドに渡してくれる点だろう。-lを使ってカウントする場合を考えてみよう。-execでは以下のように3回コマンドが実行される。buz.rbこれをxargsで書き換えてみよう。通常は以下のようにfindの出力をxargsにパイプで渡す。-lxargsには以下の3行が標準入力で渡される。-lを1回だけ実行する。実行されるコマンドは以下のとおりだ。buz.rbちなみにxargsでも-Iでプレースホルダーを指定して、任意の位置にパスを展開させることができる。その場合はコマンドは1行毎に実行される。!Null文字によるセパレートxargsはデフォルトでホワイトスペースを区切りとみなして動作するが、この挙動はパス中にスペースや改行が入っている場合に問題になる。-0を組み合わせて、findの出力とxargsの区切り文字をNull文字にする事が多い。-l引数の上限数の制御xargsでひとまとめに実行する引数の数は-nオプションで変更できる。以下の例ではechoに最大2つまで渡される。bar.rbbuz.rbマルチプロセス実行これまでxargsの例をいくつかあげてきたが、どれも1プロセスで実行していた。xargsでは-Pオプションでコマンドを複数プロセスに分けて、並列に実行させることもできる。マルチコア環境でのffmpegによるエンコードなど、並列化して早くなる見込みがあれば使ってみるのも良いだろう。xmisaoプログラマ。Rubyでhttp_wire_traceオプションを使ってAPIとの通信内容を出力する2018-09-02ChromebookでLinuxを動かす。69でC101PAは完璧なLinuxノートになる。linux2018-09-02ChromebookでLinuxを動かす。69でC101PAは完璧なLinuxノートになる。