zshを使い始めて、これは便利だと感動したファイル名グロブ(ワイルドカードを使ってファイル名のパターンマッチを行う)
**
**
は、*
*/*
*/*/*
... と任意の回数繰り返したパターンを表し、つまり、サブディレクトリを再帰的にtxtファイルを探して指定することになる。
% grep 検索文字列 **/*.txt
{,}
複数の文字列をOR条件のように指定する場合に使用。{}
の中にマッチさせたい文字列をカンマ区切りで指定して使う。
% grep 検索文字列 README_{en,ja}.txt
# grep 検索文字列 README_en.txt README_ja.txt と同じ
% mv src/dir/{tmp,file}.txt
# mv src/dir/tmp.txt src/dir/file.txt と同じ
% grep 検索文字列 **/*.{css,html}
# grep 検索文字列 **/*.css **/*.html と同じ
{,}
は正確にはファイル名グロブではなくブレース展開と呼ばれる。ファイル名グロブは存在するファイル名に置き換わるが、ブレース展開はファイルとして存在するかは関係なく、単純に文字列として展開する。
事前に展開して確認
Tab
でファイル名グロブが展開されて実際のファイル名に置き換わる。
% rm *.txt #ここでTabを押す
% rm README.txt file1.txt file2.txt #問題なければそのままEnter
元のワイルドカードに戻す場合はCtrl
+x``u
(Ctrl+xの後、Ctrlを離してuを押す)
% rm *.txt #ここでTabを押す
% rm README.txt file1.txt file2.txt #ここでCtrl+x uを押す
% rm *.txt
これなら、rmなど取り返しのつかないコマンドを実行する時も確認しながら実行できますね。
参考
WEB+DB PRESS vol.83 「zsh大活用」