zshでワイルドカード文字をグロブする - TechRepublic

zshでワイルドカード文字をグロブする - TechRepublic

出版

ヴィンセント・ダネンの画像

Vincent Danen が、ワイルドカード文字を使用したグロビングと、z シェル (zsh) でグロビングを使用するとどのように強力な結果が得られるかについて説明します。


グロブとは、非特定のファイル名に含まれるワイルドカード文字を、特定のファイル名のセットに展開する方法です。シェルはグロブを
頻繁に使用します。例えば、

$ ls foo*
フー1 フー2

上記のように入力する際、グロブ「foo*」を使用しています。シェルは
ワイルドカード文字(*)を解釈し、実際にリストするファイルをls
コマンド に渡します。つまり、この 例では実際に使用されているコマンドは「ls foo1 foo2」です。

よく使用される標準的なワイルドカードには次のようなものがあります。


  • 0文字以上の文字を表すアスタリスク(*)

  • 任意の1文字を表す疑問符(?)
  • [123]指定子は、
    文字1、2、または3のいずれかを示します。
  • [0-9] 指定子は 0 から 9 までの任意の数字(またはaからz
    までの任意の文字の場合は [az] ) を示します。

次のような名前付き範囲を使用することもできます。

  • [::alpha::] は任意の文字
  • [::alnum::] は任意の文字または数字
  • [::lower::] は任意の小文字

グロブに関しては、zshは最も強力な
シェルの一つであり、非常に興味深いワイルドカード文字を使用することができます。
例えば、特別な意味を持つ文字であるグロブ修飾子を使用できます
。現在のディレクトリにあるすべてのシンボリックリンクファイルを一覧表示したい場合は、次の
ようにします。

$ ls *(@)

zsh の glob 修飾子には、ディレクトリを表すスラッシュ (/)
や、プレーンファイルを表すピリオド (.) などがあります。zshexpnマニュアルページに完全なリストがあります。一致するものがない場合、zsh は
エラーを返します。ls プログラム(または他のプログラム)に渡すものがない場合、zsh はlsプログラムを呼び出すことさえしません

他にも便利なパターンがあります。例えば、(**/) パターンです。これは 、カレントディレクトリを含む
任意の数のディレクトリを任意の深さまでマッチさせるようにzshに指示します。 カレントディレクトリとそのサブディレクトリにあるすべての (*.sh) および (*.py) ファイルを、解析に適したリスト(つまり スクリプト内で)で見つけるには、次のようにします。


$ ls -1 **/*.(sh|py)

最後に、拡張グロビングを常に有効にするには、これを
~/.zshrc に追加します。

setopt 拡張グロブ

拡張グロブを使用する場合は、
ファイル名に含まれる特殊文字と、それらを引用符で囲む必要があることに注意してください。例えば、
scpを使ってリモートサイトからファイルをコピーする場合、zshにワイルドカードをローカルで展開させたくはありません
。ワイルドカードをscpに渡してリモート側のファイルに
マッチさせたいのです。そのため、以下の例のように、

$ scp hades:~/tmp/* 。
zsh: 一致するものが見つかりません: hades:~/tmp/*

以下を使用する必要があります:

$ scp "hades:~/tmp/*"

TechRepublicの無料Linux NetNoteは、毎週火曜日に配信され、Linuxスキルを磨くのに役立つヒント、記事、その他のリソースを提供します。今すぐ登録して、今すぐ始めましょう!

記事をシェア
ヴィンセント・ダネンの画像

ヴィンセント・ダネン

Vincent Danenは、Red Hat Security Response Teamに所属し、カナダに住んでいます。10年以上にわたりLinuxに関する執筆と開発に携わっており、Macのベテランユーザーでもあります。

Tagged: