名前がハイフンから始まるファイルを置いたときの ls の挙動について書きます。
%mkdir verif && cd ./verif % cat > -a > -b > file1 > file2 ^D
テキトーな検証用のディレクトリに移動して、如何わしい名前のファイルを作成。
このときの ls の挙動をまとめる。
「Linux環境ないよー」って人はブラウザベースでLinuxライクの端末を扱えるサービスがあります。
Javascript PC Emulator
さぁやってみましょう
ワイルドカードで実行
% ls *
ワイルドカードを指定して lsコマンドを実行してみる。気持ち的には
-a -l file1 file2
こう表示されて欲しいところ。
実際の挙動
% ls * -rw-r--r-- 1 hirokiky staff 0 11 28 17:40 file1 -rw-r--r-- 1 hirokiky staff 0 11 28 17:40 file2
残念ながら期待は大外れ。"-a", "-l" というファイルが表示されてないうえに、-lオプションを指定したみたいに表示されている。
理解の肝はワイルドカードの解釈のタイミング。ワイルドカードはシェル上で解釈されてから、lsコマンドのオプションとして渡されている。つまりワイルドカードが解釈された後に実行されたコマンドは
% ls -a -l file1 file2
となる。
シェルはワイルドカードをカレントディレクトリの「すべてのファイル」という意味で解釈しているので、上記のようなコマンド引数になる("-a", "-l", "file1", "file2" というファイルが存在している)。しかし、lsコマンドは "-a", "-l" をオプション引数として実行している。
ちなみに引数にファイル(file1とfile2)を直接指定しているので、-aオプションで表示されるはずのカレントディレクトリや親ディレクトリ、-lオプションで表示される total も表示されていない。
とりあえず解説おしまい。
他の例もあげますが、ここまで読んでおけば問題なく理解できると思います。
他の例
例2
ls -* total 0 -rw-r--r-- 1 hirokiky staff 0 11 28 17:40 -a -rw-r--r-- 1 hirokiky staff 0 11 28 17:40 -l drwxr-xr-x 6 hirokiky staff 204 11 28 17:40 . drwxr-xr-x 3 hirokiky staff 102 11 28 17:40 .. -rw-r--r-- 1 hirokiky staff 0 11 28 17:40 file1 -rw-r--r-- 1 hirokiky staff 0 11 28 17:40 file2
ワイルドカード解釈後のコマンド
ls -a -l
これだとさっきと違い、引数でファイル名を渡さないので、カレントディレクトリや total が表示されている。
例3
% ls -* * -rw-r--r-- 1 hirokiky staff 0 11 28 17:40 file1 -rw-r--r-- 1 hirokiky staff 0 11 28 17:40 file2
ワイルドカード解釈後のコマンド
% ls -a -l -a -l file1 file2
オプション引数はいくつ与えても同じなので、最初の例と同じ。
例4
% ls * -* -rw-r--r-- 1 hirokiky staff 0 11 28 17:40 -a -rw-r--r-- 1 hirokiky staff 0 11 28 17:40 -l -rw-r--r-- 1 hirokiky staff 0 11 28 17:40 file1 -rw-r--r-- 1 hirokiky staff 0 11 28 17:40 file2
ワイルドカード解釈後のコマンド
% ls -a -l file1 file2 -a -l
引数の先頭にハイフンがつかなくなった時点で、その後はすべてファイル名として解釈される。
ファイルの削除の方法
ハイフンから始まる名前のファイルを消すときは
% rm file1 -a
のようにハイフンのつかないファイルを先に指定してから削除しましょう。
おわりに
実はこの内容、オペレーティングシステムという教科でやったことです。定期試験が近づいてきているのでまとめておきました。というのは建前であまりにも面白かったので書きたくなっただけ。