本日のZSH関数

ZSHの **/*(.) はちょ便利。ディレクトリ以下全ファイル一括処理が一瞬。 ただ、あまりにファイルが多すぎると

% file2 **/*(.)
zsh: argument list too long: file2

と怒られて悲しい。ってなときは最上位のディレクトリごとに分割 して

% for d in *(/); do
file2 $d/**/*(.)
done

とするとたいていうまくいく。ってときに、直前のコマンドの **/ の部分を最上位ディレクトリごとに分割して実行する 関数。

function bydir () {(
  for d_bydir in *(/); do
    prev="$(print `fc -ln -1`)"
    eval "${prev:s,**,${d_bydir}/**,}"
  done
)}

つかいかた。

% file2 **/*(.)
zsh: argument list too long: file2
「げっ」
% bydir

でOK。でもカレントディレクトリ以下しか使えないな。要改善。 ってほど頻度も高くなさそうだ。ぽい。

:

:

:

:

困った。気になって作ってしまった。やはり完ぺきをめざすとちっとも 御手軽じゃなくなる。

function bydir () {(
    : ${(A)p::=`fc -ln -1`}
    i=0
    while [[ $i -lt $#p && "$p[$((++i))]" != *\*\*/* ]]; do ; done
    d=${p[$i]%%\*\**}"*(/)"
    new=${p[$i]#*\*\*/}
    for dir in ${~d}; do
	p[$i]="$dir/**/$new"
	cmd=`print "$p"`
	eval "$cmd"
    done
)}

叱咤激励感想ツッコミはゲストブック

Generated with mkdiary.rb
yuuji@gentei.org
Fingerprint16 = FF F9 FF CC E0 FE 5C F7 19 97 28 24 EC 5D 39 BA
HIROSE Yuuji - ASTROLOGY / BIKE / EPO / GUEST BOOK / YaTeX [Tweet]