技術メモ帳 このページをアンテナに追加 RSSフィード

2007-01-15

[]zshのzargsコマンドの使い方 12:18 zshのzargsコマンドの使い方を含むブックマーク zshのzargsコマンドの使い方のブックマークコメント

zsh には、zargsコマンド(組み込み関数) というのが用意されている。

これは、拡張グロブ用の xargs コマンドと言っても良いだろう。

マニュアルを見ると、xargs コマンドとオプションは、完全に互換しているらしい。

autoload zargs

とする事で利用可能だ。


使い方だが、xargs というと、標準入力から読み込んだ要素、行に対して

特定のコマンドを実行するというものだが

zargs の場合は、引数に指定した 拡張グロブ に対してこれらの処理を行う。

% zargs OPTIONS -- 拡張グロブ -- 実行したいコマンド

たとえば、xargs で一番利用されると思われる

ファイル数が ARG_MAX を越えてしまっているディレクトリ内のファイルを

まとめて削除したい場合などは、次のようなコマンドを入力すれば良い。

% zargs -- ./* -- rm

これだけでは真価がわかりにくい。

"拡張グロブ" が使用できるというのがポイントだ。

もっと他の例を考えてみよう。


現在のディレクトリ以下の 拡張子が ".mp3" なファイルすべてを

削除したいときは次のように入力すればよい。

当然、最大引数バイト数(ARG_MAX)に引っかかり実行がキャンセルとかされたりしない。

% zargs -- ./**/*.mp3(.) -- rm

コレと同じ事を、基本的なUNIXコマンドだけで実現するには、

結構面倒くさい

% find . -type f -name '*.mp3' -print0 | xargs -0 rm

あとはもう、いかに拡張グロブを知っているか

どうかという事になるのではあるがたとえば、

カレントディレクトリ以下の最近更新されたファイル5つを削除とかはこうなる。

% zargs -- ./**/*(.om[0,5]) -- rm


おまけ - 他のやり方

表題とずれてしまうのであくまでおまけなのだが、

zshに限って言えばこういったやり方もある。

% print -N ./**/*(.) | xargs -0 rm

printコマンドに、-N オプションを付加すると

null区切りでリストアップしてくれるのを利用。


実はもっと簡単なやり方があって、以前にも書いたのだが

zsh/filesを利用して、mvやらrmやらをzsh組み込みのものと

差し替える事により、最大バイト数の制限を受けなくするというもの。

zsh/filesで引数の最大バイト数を回避する - 技術メモ帳

% autoload zsh/files
% rm ./**/*(.)
% rm ./**/*.mp3(.)
% rm ./**/*(.om[0,5])
トラックバック - http://d.hatena.ne.jp/lurker/20070115/1168831103
Connection: close