ディレクトリについてメモ

チルダ展開

ユーザーのホームディレクトリを省略できる。
ユーザー名「green_csharper」としてそのホームディレクトリ以下のdocディレクトリに移動する場合。

$ cd ~green_csharper/doc

けど、自分が触った事ある環境だとユーザーのディレクトリは「/home」直下にユーザー名でディレクトリが用意されてるのでそれほどありがたみは無いかも。

ちなみに「~」はログインユーザー自身のホームディレクトリはさらに省略できます。
つまり上記と同じ例だとこうなる。

$ cd ~/doc

これだとだいぶ便利になりますね。

作業ディレクトリを表示する「pwd

そのままですね、カレントディレクトリの完全パスを教えてくれます。

$ cd ~/opt
$ pwd
/home/green_csharper/opt

一つ前の移動元へ戻る「cd -」

これ知りませんでしたorz

$ cd /etc
$ pwd
/etc
$ cd ~/opt
$ pwd
/home/green_csharper/opt
$ cd -
$ pwd
/etc

すごく便利です!

必ずいる隠しファイル「.」「..」

ディレクトリ内を一覧する「ls」コマンドにオプションで「a」を指定して隠しファイルも表示させると、必ず「.」と「..」がいますよね。なんとなくスルーしてたんですが、彼らも隠しファイルだそうです。
ご存知の通り

を指しています。
ルートの場合は自分自身が親になるそうですよ。

ワイルドカード展開(またはグロビング - globbing)

以下が最も基本的な4種類だそうです。

ワイルドカード 一致対象
? 任意の1文字
* 任意も文字列
[set] setに含まれている文字
[!set] setに含まれていない文字
使い方

「?」と「*」に関してはそのままなので割愛します。
ちなみ「*」ですが、C#とかでファイルの一覧取得する時はよく「*.*」としますが、Unix系では「*」のみで指定します。
というか、「*.*」とかやっちゃうと、「.」が入ってるファイルしか取ってこないからダメになってしまうのです。
Unix系では「.」に特別に意味はなく、文字の一つに過ぎないからということらしいですね。

「[set]」は指定した1文字という事です。
例えば

  • [abcde] ならば a, b, c, d, eのどれか
  • [a-e] ならば 上記と同じ
  • [a-z] ならば 小文字のアルファベットのどれか
  • [0-9] ならば 0から9までの数字のどれか
  • [a-zA-Z] ならば 小文字・大文字のアルファベットのどれか

となります。
最初に「!」を入れると否定になります。

記号も含められます。ただし、ハイフンは範囲指定に使っているので最初か最後にしか指定できません。

  • [-.;,_]

また、「!」自体を照合するにはセットの1文字目の後に指定するか、「[\!]」のようにバックスラッシュを前に付けて指定します。

ワイルドカードの組み合わせ

ワイルドカード展開は組み合わせて使えます。

  • *.[ab] (ピリオドに続いてa, bで終わる全てのファイル -> sample.a, test.b)

とっても便利ですね。
ちなみにこれらはパス名展開と呼ばれる概念の一部だそうです。
lsコマンドなどと組み合わせると力を発揮します。

$ ls /usr[0-9]/*.sh <- /usrの後に数字1文字が続く全てのディレクトリの中の.shファイル全てを一覧する(/usr1/test.sh)

ブレース展開

所定の書式に則って任意の文字列を展開します。

  • オプションの序文、それに続く中括弧で囲まれたカンマ区切りの文字列、それに続くオプションの追文で構成されます。
使い方

「..」での特殊な展開や、入れ子もできます。

$ echo {a,b,c}
a b c
$ echo pre{a,b,c}
prea preb prec
$ echo {a,b,c}post
apost bpost cpost
$ echo {a..e}
a b c d e
$ echo {1..5}
1 2 3 4 5
$ echo a{b{c,d},e}f
abcf abdf aef

ちなみにカンマで並べる文字列の間に気を効かして空白を入れて「{a, b, c}」とかするとダメでした。

ワイルドカード展開と併用する事もできます。
以下の2つは同じ結果を返します。

$ ls *.[cho]
$ ls *.{c,h,o}