Edited at

zshのfor文は強かった

More than 3 years have passed since last update.

zsh超初心者につき備忘録程度の内容。


for文ワンライナー

例えば、

for f (1.txt 2.txt) rm $f

ってやれば1.txtと2.txtを削除してくれる。

for f (*.txt) {echo $f; cat $f}

ってやれば同一階層内のtxtのファイル名と中身を一気に出力してくれる。

for f (**/*) echo $f

ってやれば同一階層内かそれより深いファイル全てのファイル名を表示してくれる。


ファイル名変数

以上3つのfor文はすべて$fにファイル名が代入されている。

本当に便利なのはここから。

for f (*.tx) mv $f $f:r.txt

こうすると、同一階層の◯◯.txが全て◯◯.txtにリネームされる。


変数オプション

上記スクリプトの場合を例にとると、$fの後に:rをつけることでファイル名の名前部分(拡張子以外)が取得できる。

試してみたところ以下のオプションが確認できた。

※カレントディレクトリは/root/pwd、対象ファイルは/root/pwd/directory/File 1.extとします。

オプション
内容
結果

$f(なし)
現在のディレクトリからのパス
directory/File 1.ext

$f:a
ルートからのフルパス
/root/pwd/directory/File 1.ext

$f:e
拡張子
ext

$f:h
$fを含むディレクトリ名(ユニーク)
directory

$f:l
小文字に置換
directory/file 1.ext

$f:q
エスケープ表現
directory/File\ 1.ext

$f:r
ファイル名(拡張子を除く)
directory/File 1

$f:t
ファイル名(ディレクトリを除く)
File 1.ext

$f:u
大文字に置換
DIRECTORY/FILE 1.EXT

これらのオプションは複合させることもできる。

例えば、$f:t:uとするとFILE 1.EXTが得られる。