Make組ブログ

Python、Webサービスや製品開発、ライブラリー開発についてhirokikyが書きます

lsで遊ぶ、名前がハイフンから始まるファイルを置いてみた。

名前がハイフンから始まるファイルを置いたときの 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

のようにハイフンのつかないファイルを先に指定してから削除しましょう。

おわりに

実はこの内容、オペレーティングシステムという教科でやったことです。定期試験が近づいてきているのでまとめておきました。というのは建前であまりにも面白かったので書きたくなっただけ。