find,xargs,cpのあれこれ
カレントディレクトリにあるドットファイルだけをコピーしようとしたときに,findの結果をxargsを使ってcpに渡そうとしたときのメモ.
xargsは渡されたコマンドの後ろに標準入力からの文字列をつなげる.なのでfindした結果をどこかにコピーしたいといったときに,cpが「cp <コピー元(ここにfindの結果が来てほしい)> <コピー先>」という書き方なので困ってしまう.
とりあえずxargsの「-i」オプションを使用するとcpにfindの結果を渡せるようになる.
> find . -maxdepth 1 -name '.*' -type f -print0 | xargs -0 -i 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 ~/
コメントはまだありません。