2.3 レッスン 2
Certificate: |
Linux Essentials |
---|---|
Version: |
1.6 |
Topic: |
2 Linuxでのやりかたを見つける |
Objective: |
2.3 ディレクトリの利用とファイルの一覧 |
Lesson: |
2 of 2 |
はじめに
Unixオペレーティングシステムは、もともとはメインフレームコンピュータ用に1960年代半ばに設計されました。これらのコンピューターは、ターミナル を介してシステムのリソースにアクセスする多くのユーザーで共有されていました。これらの基本的なアイデアは、今日のLinuxシステムにも継承されています。シェルにコマンドを入力するために “ターミナル” を使用することは、いまだによく話題に上りますし、すべてのLinuxシステムは、1つのシステムに多くのユーザーを簡単に作成できるように構成されています。
ホームディレクトリ
これは、Linuxにおける標準的なファイルシステムの例です:
$ tree -L 1 / / ├── bin ├── boot ├── cdrom ├── dev ├── etc ├── home ├── lib ├── mnt ├── opt ├── proc ├── root ├── run ├── sbin ├── srv ├── sys ├── tmp ├── usr └── var
これらのディレクトリのほとんどは、すべてのLinuxシステムに共通しています。サーバからスーパーコンピュータ、小型の組み込みシステムまで、経験豊富な Linux ユーザは、/bin
の中に ls
コマンドがあり、/etc
の中のファイルを変更してシステム設定を変更し、 /var
にあるシステムログを読むことができることを知っています。これらのファイルやディレクトリの場所は、ファイルシステム階層標準(Filesystem Hierarchy Standard/FHS)によって標準化されているので、後のレッスンで説明します。それぞれのディレクトリの内容については、Linux の学習を続けていくうちにさらに詳しく知ることになるでしょうが、今のところは、標準化されていることを知っておきましょう。
-
ルートファイルシステムの変更は、すべてのユーザーに影響します
-
また、ルートファイルシステムのファイルを変更するには、管理者権限が必要です
つまり、一般ユーザーがこれらのファイルを変更することは禁止されており、読み取ることも禁止されていることがあります。権限については、後のセクションで説明します。
では、すでにお馴染みの home
ディレクトリに着目してみましょう:
$ tree -L 1 /home /home ├── user ├── michael └── lara
この例で取り上げるシステムには、3人の一般ユーザーがいて、各ユーザーは専用の場所を持っています。この場所では、隣人に影響を与えることなくファイルやディレクトリを作成・変更できます。たとえば、前のレッスンでは、次のファイル構造を取り上げました。
$ tree /home/user user └── Documents ├── Mission-Statement └── Reports └── report2018.txt
実際のファイルシステムでは、次のようになります:
$ tree /home /home ├── user │ └── Documents │ ├── Mission-Statement │ └── Reports │ └── report2018.txt ├── michael │ ├── Documents │ │ └── presentation-for-clients.odp │ └── Music
…lara
についても同様です。
Linuxの /home
は、アパートに似ています。多くのユーザーが専用の部屋に分かれて、それぞれのスペースを使っています。共有設備と建物自体のメンテナンスは、管理者であるrootユーザーの責任です。
ホームを示す特別な相対パス
Linuxでターミナルセッションを開始すると、次のようなコマンドプロンプトが表示されます:
user@hostname ~ $
ここでのチルダ(~
)は、ホームディレクトリ を示します。 ls
コマンドを実行すると、見慣れた出力が行われることでしょう:
$ cd ~ $ ls Documents
前述のファイルシステムと見比べて、自身の理解度を確認しましょう。
先ほどのたとえを思い出してみましょう。アパートに類似していて、/home
には多くのユーザーが住んでいます。user
の部屋と michael
の部屋は別々です。これを確認するために、su
コマンド(Switch User)を使ってユーザーを切り替えてみましょう。
user@hostname ~ $ pwd /home/user user@hostname ~ $ su - michael Password: michael@hostname ~ $ pwd /home/michael
チルダ文字 ~
の意味はユーザー毎に異なります。 michael
にとっての ~
は絶対パスで /home/michael
ですし、 lara
にとっての ~
は絶対パスで /home/lara
になります。
ホームに相対なパス
ユーザーを切り替えない限り、~
は(同じパスを指し続けるので)便利に使えます。次の例について考察してみましょう。 user
は新しいセッションを始めたばかりだとします:
$ ls Documents $ cd Documents $ ls Mission-Statement Reports $ cd Reports $ ls report2018.txt $ cd ~ $ ls Documents
ユーザーは必ず、そのホームディレクトリから新しいセッションを開始することに注意しましょう。この例では、user
は Documents/Reports
サブディレクトリに移動してから、cd ~
コマンドで出発点に戻っています。引数を付けない cd
コマンドでも、同じことが行えます:
$ cd Documents/Reports $ pwd /home/user/Documents/Reports $ cd $ pwd /home/user
~
について最後にもう一つ: チルダに続いて、他のユーザー名 を置くと、そのユーザーのホームディレクトリを示します。
$ ls ~michael Documents Music
この実行例は、michael
がそのホームディレクトリの内容を読み出すことを許可した場合にのみ行えます。
michael
が user
のホームディレクトリにあるファイル report2018.txt
を表示したいとします。michael
がそうする許可を持っていれば、michael
は次のように less
コマンドを使用して表示できます。
$ less ~user/Documents/Reports/report2018.txt
文字 ~
を含むパスを、ホームに相対(relative-to-home)なパスと呼びます。(訳注: 日本ではこの呼び方はほとんど使われておらず、単に「チルダ」と呼ぶことが多い。)
隠しファイルと隠しディレクトリ
前のレッスンでは、ls
コマンドの -a
オプションを紹介しました。ls -a
で表示される2つの特別な相対パス .
と ..
も紹介しました。-a
オプションは、隠し ファイルと 隠し ディレクトリを含む、すべての ファイルとディレクトリをリスト表示します。
$ ls -a ~ . .. .bash_history .bash_logout .bash-profile .bashrc Documents
隠しファイルと隠しディレクトリは、名前がピリオド(.
)で始まります。ユーザーのホームディレクトリには、デフォルトで多くの隠しファイルが含まれてます。これらは、ユーザー独自の設定を調整するためのもので、経験豊富なユーザーが主に変更します。
長い形式オプション
ls
コマンドには多くのオプションがあり、その動作を変更することができます。最も一般的なオプションの1つを見てみましょう。
$ ls -l -rw-r--r-- 1 user staff 3606 Jan 13 2017 report2018.txt
-l
オプションは 長い形式 の表示を行います。ファイルやディレクトリは、それぞれが1行全体を使用して表示されます。
-rw-r—r--
-
ファイルの種別とそのパーミッションを示しています。通常ファイルの1文字目はハイフンで、ディレクトリは
d
で始まります。 1
-
ファイルのリンク数を示しています。
user staff
-
ファイルの所有者を示しています。ファイルの所有者は
user
であり、staff
グループにも関連付けられています。 3606
-
ファイルのサイズを、バイト単位で表示しています。
Jan 13 2017
-
ファイルが最後に変更されたタイムスタンプを示しています。(訳注: システムの言語設定によって表記方法が異なります)
report2018.txt
-
ファイルの名前を示しています。
所有者、パーミッション、リンクについては、後の章で説明します。このように、長い形式の表示は、デフォルトの表示よりも多くの情報を含んでいます。
lsのその他のオプション
以下に、ls
コマンドでもっとも良く使われるオプションを示します。例示するように、目的とする出力を得るために、複数のオプションを組み合わせることができます。
ls -lh
-
長い形式 と 人が読みやすい形式 を組み合わせると、ファイルサイズに
K
(キロバイト)やM
(メガバイト)などのサフィックスが付けられます。 ls -d */
-
-d
オプションは、ディレクトリの情報を表示しますが、その内容は表示しません。*/
と組み合わせると、ファイルを除外してサブディレクトリのみを表示します。 ls -lt
-
長い形式
と変更日時
による並び替えを組み合わせます。直近に変更されたものを先頭に、最も昔に変更されたものを末尾に並びます。順序は、次に示すように逆にすることができます。 ls -lrt
-
長い形式
と変更日時
による並び替えに加えて、逆順 を意味する-r
を組み合わせたものです。この場合は、最も古いものが先頭に、最も新しいものが末尾にリストされます。変更日時 ではなく、アクセス日時 や、ステータス変更日時 による並び替えも行えます。 ls -lX
-
長い形式
とファイル名のサフィックス
による並び替えを組み合わせたものです。例えば、ファイル名が.txt
で終わるものや、.jpg
で 終わるものがまとめて表示されます。 ls -S
-
-S
オプションは、-t
(時刻)や-X
(サフィックス)と同様に、ファイル サイズ で並び替えを行います。一番大きなファイルが先頭に、一番小さなファイルが末尾に来ます。サブディレクトリの内容は、並び替えに 含まれない ことに注意してください。 ls -R
-
-R
オプションは、ls
コマンドに 再帰的に 表示するように指示します。再帰とはどのようなことでしょうか。
Bashにおける再帰
再帰とは、“何かがその定義自体の中に含まれている” 状況を意味します。コンピュータサイエンスでは非常に重要な概念ですが、ここでの意味はもっと簡単です。先の例を考えてみましょう。
$ ls ~ Documents
user
はホームディレクトリに居て、そのディレクトリには1つのサブディレクトリがあるのでした。ls
は、そこにあるファイルとサブディレクトリを表示するだけで、サブディレクトリの内容は表示されませんでした。複数のサブディレクトリの内容を表示するために、このレッスンでは tree
コマンドを使います。あいにくと、tree
はLinuxのコアユーティリティではないので、常に使用できるとは限りません。以下の例では、tree
の出力と、ls -R
の出力を比べてみます。
$ tree /home/user user └── Documents ├── Mission-Statement └── Reports └── report2018.txt $ ls -R ~ /home/user/: Documents /home/user/Documents: Mission-Statement Reports /home/user/Documents/Reports: report2018.txt
このように、再帰オプションを使用すると、はるかに長い出力が得られます。user
のホームディレクトリで ls
コマンドを実行すると、サブディレクトリに出会います。次に、そのサブディレクトリに入って、再度 ls
コマンドを実行します。そこでは、Mission-Statement
ファイルと、Reports
というサブディレクトリに出会います。再び、そのサブディレクトリに入り、ls
コマンドを再実行します。つまるところ、 ls -R
を実行することは、Bashに “ここで ls
を実行し、出会ったすべてのサブディレクトリでコマンドを繰り返せ” と伝えるようなものです。
再帰は、ディレクトリのコピーや削除などの、ファイルを変更するコマンドで特に重要です。たとえば、Documents
サブディレクトリをコピーする場合、すべてのサブディレクトリも一緒にコピーするには、再帰的なコピーを指示する必要があります。
演習
-
下のファイル構造を見て、以下の3つの問いに答えましょう:
/ ├── etc/ │ ├── network/ │ │ └── interfaces/ │ ├── systemd/ │ │ ├── resolved.conf │ │ ├── system/ │ │ ├── system.conf │ │ ├── user/ │ │ └── user.conf │ └── udev/ │ ├── rules.d │ └── udev.conf └── home/ ├── lost+found/ ├── user/ │ └── Documents/ └── michael/ └── Music/
-
現在の位置によらず、
network
ディレクトリに移動するコマンドは何ですか? -
/etc/udev
ディレクトリから、user
がDocuments
ディレクトリに移動するコマンドは何ですか? 最短のパスを指定してください。 -
user
が、michael
のMusic
ディレクトリに移動するコマンドは何ですか? 最短のパスを指定してください。
-
-
下の
ls -lh
からの出力を見て、以下の2つの問いに答えましょう:drwxrwxrwx 5 eric eric 4.0K Apr 26 2011 China/ -rwxrwxrwx 1 eric eric 1.5M Jul 18 2011 img_0066.jpg -rwxrwxrwx 1 eric eric 1.5M Jul 18 2011 img_0067.jpg -rwxrwxrwx 1 eric eric 1.6M Jul 18 2011 img_0074.jpg -rwxrwxrwx 1 eric eric 1.8M Jul 18 2011 img_0075.jpg -rwxrwxrwx 1 eric eric 46K Jul 18 2011 scary.jpg -rwxrwxrwx 1 eric eric 469K Jan 29 2018 Screenshot from 2017-08-13 21-22-24.png -rwxrwxrwx 1 eric eric 498K Jan 29 2018 Screenshot from 2017-08-14 21-18-07.png -rwxrwxrwx 1 eric eric 211K Jan 29 2018 Screenshot from 2018-01-06 23-29-30.png -rwxrwxrwx 1 eric eric 150K Jul 18 2011 tobermory.jpg drwxrwxrwx 6 eric eric 4.0K Apr 26 2011 Tokyo/ -rwxrwxrwx 1 eric eric 1.4M Jul 18 2011 Toronto 081.jpg -rwxrwxrwx 1 eric eric 1.4M Jul 18 2011 Toronto 085.jpg -rwxrwxrwx 1 eric eric 944K Jul 18 2011 Toronto 152.jpg -rwxrwxrwx 1 eric eric 728K Jul 18 2011 Toronto 173.jpg drwxrwxrwx 2 eric eric 4.0K Jun 5 2016 Wallpapers/
-
ls -lrS
コマンドを実行すると、最初に来るファイルはどれですか? -
ls -ad */
コマンドの出力がどうなるかを説明してください。
-
発展演習
-
サブディレクトリがあるディレクトリで、
ls -lh
コマンドを実行します。表示されたディレクトリのサイズに着目します。それらのファイルサイズは正しいでしょうか? 表示内容は、そのディレクトリ内のすべてのファイルの内容を正確に示していますか? -
新しいコマンド
du -h
を使ってみましょう。このコマンドを実行して、その出力を説明してください。 -
多くのLinuxシステムでは、
ll
を入力するとls -l
を入力したのと同じ出力が得られます。ただし、ll
はコマンドでは ありません 。たとえば、man ll
と入力しても、マニュアル項目がないというメッセージが表示されます。これは、別名(エイリアス) の例です。別名の便利な点を挙げましょう。
まとめ
このレッスンでは以下の事柄を学習しました:
-
Linuxのそれぞれのユーザーは、ホームディレクトリを持つこと
-
現在のユーザーのホームディレクトリは、
~
で表されること -
~
を含むパスを、 ホームに相対 (relative-to-home)なパスと呼ぶこと(訳注: 日本ではほとんど使われていません)
また、ls
コマンドの動作を調整するよく使われるオプションについても学びました。
-a
(all)-
隠しファイルや隠しディレクトリを含む、すべてを表示します
-d
(directories)-
ディレクトリの内容ではなく、ディレクトリ自体の情報を表示します
-h
(human readable)-
ファイルサイズを、人間が読みやすい形式で表示します
-l
(long list)-
ファイルやディレクトリ毎に1行を使い、多くの情報を表示します
-r
(reverse)-
並び替えの順序を反転します
-R
(recursive)-
サブディレクトリに含まれるファイルを含む、すべてのファイルを表示します
-S
(size)-
ファイルサイズで並べ替えます
-t
(time)-
更新日時で並び替えます
-X
(eXtension)-
ファイル名のサフィックス毎に並び替えます
演習の解答
-
下のファイル構造を見て、以下の3つの問いに答えましょう:
/ ├── etc/ │ ├── network/ │ │ └── interfaces/ │ ├── systemd/ │ │ ├── resolved.conf │ │ ├── system/ │ │ ├── system.conf │ │ ├── user/ │ │ └── user.conf │ └── udev/ │ ├── rules.d │ └── udev.conf └── home/ ├── lost+found/ ├── user/ │ └── Documents/ └── michael/ └── Music/
-
現在の位置によらず、
network
ディレクトリに移動するコマンドは何ですか?cd /etc/network
-
/etc/udev
ディレクトリから、user
がDocuments
ディレクトリに移動するコマンドは何ですか? 最短のパスを指定してください。cd ~/Documents
-
user
が、michael
のMusic
ディレクトリに移動するコマンドは何ですか? 最短のパスを指定してください。cd ~michael/Music
-
-
下の
ls -lh
からの出力を見て、以下の2つの問いに答えましょう。ディレクトリは先頭の文字がd
で表示されることに気をつけましょう。drwxrwxrwx 5 eric eric 4.0K Apr 26 2011 China/ -rwxrwxrwx 1 eric eric 1.5M Jul 18 2011 img_0066.jpg -rwxrwxrwx 1 eric eric 1.5M Jul 18 2011 img_0067.jpg -rwxrwxrwx 1 eric eric 1.6M Jul 18 2011 img_0074.jpg -rwxrwxrwx 1 eric eric 1.8M Jul 18 2011 img_0075.jpg -rwxrwxrwx 1 eric eric 46K Jul 18 2011 scary.jpg -rwxrwxrwx 1 eric eric 469K Jan 29 2018 Screenshot from 2017-08-13 21-22-24.png -rwxrwxrwx 1 eric eric 498K Jan 29 2018 Screenshot from 2017-08-14 21-18-07.png -rwxrwxrwx 1 eric eric 211K Jan 29 2018 Screenshot from 2018-01-06 23-29-30.png -rwxrwxrwx 1 eric eric 150K Jul 18 2011 tobermory.jpg drwxrwxrwx 6 eric eric 4.0K Apr 26 2011 Tokyo/ -rwxrwxrwx 1 eric eric 1.4M Jul 18 2011 Toronto 081.jpg -rwxrwxrwx 1 eric eric 1.4M Jul 18 2011 Toronto 085.jpg -rwxrwxrwx 1 eric eric 944K Jul 18 2011 Toronto 152.jpg -rwxrwxrwx 1 eric eric 728K Jul 18 2011 Toronto 173.jpg drwxrwxrwx 2 eric eric 4.0K Jun 5 2016 Wallpapers/
-
ls -lrS
コマンドを実行すると、最初に来るファイルはどれですか?3つのディレクトリはいずれもサイズが(ディレクトリとして)最小の4.0Kです。デフォルトで
ls
はディレクトリをアルファベット順に並べます。正解はファイルscary.jpg
です。 -
ls -ad */
コマンドの出力がどうなるかを説明してください。このコマンドは、隠しディレクトリを含むすべてのサブディレクトリを表示します。
-
発展演習の解答
-
サブディレクトリがあるディレクトリで、
ls -lh
コマンドを実行します。表示されたディレクトリのサイズに着目します。それらのファイルサイズは正しいでしょうか? 表示内容は、そのディレクトリ内のすべてのファイルの内容を正確に示していますか?いいえ、正しくありません。各ディレクトリのファイルサイズは、4096バイトと表示されています。これは、ディレクトリが抽象化されていて、実際のディスク上では木構造として存在していないからです。一覧におけるディレクトリは、ファイルのリストへの リンク が表示されているのです。これらのリンクのサイズは、少なくとも4096バイトになります。
-
新しいコマンド
du -h
を使ってみましょう。このコマンドを実行して、その出力を説明してください。du
コマンドは、すべてのファイルとディレクトリのリストを生成し、それぞれのサイズを示します。一例として、du -s
は、現在の位置から、すべてのファイル、ディレクトリ、サブディレクトリのサイズを表示します。 -
多くのLinuxシステムでは、
ll
を入力するとls -l
を入力したのと同じ出力が得られます。ただし、ll
はコマンドでは ありません 。たとえば、man ll
と入力しても、マニュアル項目がないというメッセージが表示されます。これは、別名(エイリアス) の例です。別名の便利な点を挙げましょう。ll
はls -l
の エイリアス です。 Bashでは、エイリアスを使用して、よく使用されるコマンドを簡略化できます。 Linuxではll
が定義されていることが多いですが、独自のエイリアスを作成することもできます。