find,xargs,cpのあれこれ

Posted by mkamo on 2009年5月30日

カレントディレクトリにあるドットファイルだけをコピーしようとしたときに,findの結果をxargsを使ってcpに渡そうとしたときのメモ.

xargsは渡されたコマンドの後ろに標準入力からの文字列をつなげる.なのでfindした結果をどこかにコピーしたいといったときに,cpが「cp <コピー元(ここにfindの結果が来てほしい)> <コピー先>」という書き方なので困ってしまう.

とりあえずxargsの「-i」オプションを使用するとcpにfindの結果を渡せるようになる.

> find . -maxdepth 1 -name '.*' -type f -print0 | xargs -0 -i cp {} ~/

これで一応目的は達成できているのだが,このやり方ではファイル1個に対して一回ずつcpコマンドが実行されてしまう.よくよくcpのmanを読んでみると「-t」オプションがxargsと一緒に使うと便利などと書いてあったので使ってみた.最終的なコマンドラインは以下のとおり.

> find . -maxdepth 1 -name '.*' -type f -print0 | xargs -0 cp -t ~/

ちなみにfindに「-print0」オプション,xargsに「-0」オプションをつけているのはホワイトスペースを含んだファイル名でもうまく扱えるようにfindからxargs渡す文字列をヌル文字区切りにするため.

ついでにmvとlnのmanも見てみたら同様のオプションがあった.以下のように使える.

> find . -maxdepth 1 -name '.*' -type f -print0 | xargs -0 mv -t ~/
> find . -maxdepth 1 -name '.*' -type f -print0 | xargs -0 ln -s -t ~/


コメントを書く




XHTML: 次のタグが使用できます: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>

Please note: 投稿されたコメントが表示されるにはいくらかの時間がかかります.投稿後直ちに表示されませんが投稿ボタンを何度も押さないようお願いします.