パス展開

Linuxコマンドの引数でワイルドカード(?*)などを使うと、まずシェルがそのパターンにマッチするファイル・ディレクトリ名を探し出し、そのパスが実際のコマンド引数として渡される。この機能をパス展開という。


    パス展開

    Linuxコマンドの引数にファイル・ディレクトリ名(パス)を渡すことは多いが、完全な名前でなくとも、ワイルドカード(?*)などを用いたパターンによる指定ができる。

    例えば?は「任意の一文字」を意味するので、下記はlsコマンドに対して「(カレントディレクトリで)名前が3文字のファイル・ディレクトリ」を渡している。

    ls ???

    これは、lsコマンドが「???」という文字列を処理したのではなく、シェルが「名前が3文字のファイル・ディレクトリ」を探し出しlsコマンドに渡している。このシェルによる処理をパス展開という。

    例えば「abc」「xyz」というファイルが存在すると、

    echo ???
    abc xyz
    

    これは、自分でecho abc xyzと打ったのと同じ。また、「date」というファイルだけが存在すると、????と打つとパス展開されてdateコマンドを打ったことになるから、こうなる。

    ????
    2016年  4月 19日 火曜日 23:37:10 JST
    

    マッチするファイル・ディレクトリがない場合、パターンの文字がそのままコマンドに渡される。

    echo ?????
    ?????
    

    パス展開をさせない場合

    パス展開をさせずに単に文字としてコマンドに渡したいなら、'"で囲む。例えば「abc」「xyz」というファイルが存在する場合、

    echo ??? "???" ???
    abc xyz ??? abc xyz
    

    真ん中だけ文字としての「???」になっている。


    パス展開の例

    パス展開の例
    パターン 意味
    ~ ホームディレクトリにマッチ。
    ~ユーザ 指定ユーザのホームディレクトリにマッチ。
    ? 任意の一文字にマッチ。
    * 先頭の.を除いた全ての文字列にマッチ。文字なしにもマッチ。
    [文字] 文字のいずれかにマッチ。
    [^文字] 文字以外の文字にマッチ。^の代わりに!でも。
    [0-9] 文字範囲。数字にマッチ。
    [a-z] 小文字にマッチ。A-Zなら大文字。
    {パターン1,パターン2} or検索。パターン1かパターン2にマッチ。(ブレース展開)

    *は、ドットファイル(.から始まるファイル)やディレクトリの下層にもマッチしない。

    # ホームディレクトリ
    ~
    
    # aliceのホームディレクトリ
    ~alice
    
    # 拡張子が3文字
    *.???
    
    # 拡張子が.txt
    *.txt
    
    # aから始まる。aというファイルにもマッチ
    a*
    
    # 数字か小文字で始まる
    [0-9a-z]*
    
    # ドットファイルにマッチ
    .*
    
    # 拡張子が.txtか.csv
    *.{txt,csv}
    
    # xyz以外の文字で始まる
    [^x-z]*
    
    # 一つ下層のディレクトリのファイル
    */*