第3章 基本操作(移動・確認)
ここからは実際のコマンドを見ていきます。まずは「今どこにいるか」「何があるか」「どこへ移動するか」を確認する、もっとも基本の5つのコマンドです。
コマンドの基本的な書式
本題に入る前に、Linuxコマンドに共通する書式を押さえておきましょう。多くのコマンドは次のような形をしています。
コマンド名 [オプション] [引数]
オプションはコマンドの動作を細かく調整するための指定で、-lのように短い1文字のハイフン付き(ショートオプション)と、--allのように単語をハイフン2つで書くもの(ロングオプション)があります。引数は、そのコマンドの操作対象(ファイル名やディレクトリ名など)です。オプションは複数同時に指定でき、ショートオプション同士は -la のようにまとめて書くこともできます(-l -aと同じ意味になります)。この規則さえ分かっていれば、初めて見るコマンドでも「これはオプションだな」「これは対象だな」と読み解けるようになります。
pwd — 現在地を確認する
pwd(print working directory)は、今いるディレクトリの絶対パスを表示します。作業を始めるときや、複数のディレクトリを行き来してわからなくなったときに、まず打つべきコマンドです。
$ pwd
/home/user
ls — 中身を一覧表示する
ls(list)は、指定したディレクトリの中身を一覧表示します。よく使うオプションは次のとおりです(組み合わせて ls -la のようにも使えます)。
| オプション | 意味 |
|---|---|
-l | 権限・所有者・サイズなど詳細情報付きで表示(long format) |
-a | 「.」から始まる隠しファイルも表示(all) |
-h | -lと組み合わせ、ファイルサイズをKB/MBなど読みやすい単位で表示(human-readable) |
-t | 更新日時が新しい順に並び替える |
-R | サブディレクトリの中身も再帰的に表示する |
-1 | 1行に1ファイルずつ表示する |
-F | ディレクトリには/、実行可能ファイルには*など種別を示す記号を末尾に付ける |
$ ls
memo.txt notes readme.txt
$ ls -l
-rw-r--r-- user user 25 memo.txt
drwxr-xr-x user user 0 notes
-rw-r--r-- user user 108 readme.txt
$ ls -lah # 詳細表示 + 隠しファイルも + サイズを読みやすく
total 20K
drwxr-xr-x 2 user user 4.0K 8月 20 09:15 .
drwxr-xr-x 5 user user 4.0K 8月 18 21:03 ..
-rw-r--r-- 1 user user 220 8月 18 21:03 .bashrc
-rw-r--r-- 1 user user 25 8月 20 09:10 memo.txt
drwxr-xr-x 2 user user 4.0K 8月 19 14:22 notes
-rw-r--r-- 1 user user 108 8月 20 09:12 readme.txt
この行のこの値に注目: 先頭のtotal 20Kは、このディレクトリ内の全エントリが使用するブロック単位の合計サイズを示す集計行で、各行のファイルサイズを単純に足した値とは一致しません。-aの効果で.(自分自身)・..(親ディレクトリ)・.bashrcのような隠しファイルまで表示され、-hの効果でサイズが4.0Kのように読みやすい単位に変換されています。
ls -lの出力の一番左にある10文字(例: -rw-r--r--)は、そのファイルの種類とパーミッション(アクセス権限)を表しています。先頭の1文字は種類を表し、-なら通常のファイル、dならディレクトリです。残りの9文字は「誰が」「何をできるか」を表す情報で、詳しくは第6章で扱います。今の段階では、行の先頭を見れば「ファイルかディレクトリか」が一目で分かる、ということだけ覚えておけば十分です。
先ほどの出力例で言うと、パーミッション文字列の後に続く2つのuserはそれぞれ「所有者(そのファイルを持っているユーザー)」と「所有グループ」を表し、その次の数字がファイルサイズ(バイト単位)、最後にファイル名が続きます。実際の環境ではこの間に更新日時の列も表示されます。1行の情報量が多く感じられるかもしれませんが、「種類・権限|所有者|グループ|サイズ|更新日時|名前」という並び順さえ覚えておけば、どの環境のls -lを見ても読み解けるようになります。
lsにディレクトリ名を引数として渡すと、そのディレクトリの中身を表示できます。カレントディレクトリを変えずに他のディレクトリの様子だけをちょっと覗きたいときに便利です。
$ ls notes # notesディレクトリの中身を表示(移動はしない)
todo.txt
cd — ディレクトリを移動する
cd(change directory)で移動します。引数を省略するとホームディレクトリに戻ります。
$ cd notes
$ pwd
/home/user/notes
$ cd ..
$ cd # 引数なし → ホームディレクトリへ
親ディレクトリを2つ以上さかのぼりたいときは、cd ../.. のように .. を / でつなげます。一度のコマンドで複数階層をまとめて移動できます。
また、絶対パスを使えば今いる場所に関係なく一気に目的地へジャンプできます。「近くのディレクトリなら相対パス、遠くのディレクトリなら絶対パス」を使い分けると効率的です。
$ cd /home/user/notes # 今どこにいても絶対パスで一気に移動
$ pwd
/home/user/notes
実機のシェルでは cd - という書き方も便利です。これは「ひとつ前にいたディレクトリに戻る」という意味で、2つのディレクトリを行ったり来たりする作業(設定ファイルの編集とログの確認を交互に行う、など)でタイプ数を大きく減らせます。
cdで移動した後にlsを打つのを忘れてしまい、「今どんなファイルがあるか分からないまま次の操作をしてしまう」というミスがよくあります。cdで移動したら、まずlsで中身を確認する、pwdで現在地を確認する、という2つを習慣にしておくと安全です。
lsやcpとは違い、cdは実は独立したプログラムではなく、シェル自身が持っている機能(組み込みコマンド)です。もしcdがlsと同じように「別のプログラムを新しく起動する」形だったとしたら、その別プログラムの中でどれだけcdしても、移動できるのはその別プログラム自身の作業場所だけで、元のシェルの現在地には反映されません(第7章で学ぶ「プロセスはそれぞれ独立している」という性質のためです)。「現在地」というシェル自身の状態を書き換える必要があるからこそ、cdは別プロセスを作らず、シェルにあらかじめ組み込まれた機能として実装されているのです。
mkdir / rmdir — ディレクトリの作成と削除
$ mkdir projects # ディレクトリを作成
$ mkdir -p a/b/c # 親ディレクトリごとまとめて作成
$ rmdir projects # 空のディレクトリを削除
rmdir は中身が空のディレクトリしか削除できません。中身ごと削除する方法は次章の rm -r で扱います。rmdirに-rのようなオプションはなく、中身が入ったディレクトリに対して実行すると「ディレクトリが空ではありません」というエラーになります。これは、うっかり中身ごと大事なフォルダを消してしまう事故を防ぐための安全設計だと理解しておくとよいでしょう。
mkdir -pの-pは「parents」の頭文字で、途中の親ディレクトリが存在しない場合でもまとめて作成してくれます。-pを付けずにmkdir a/b/cを実行し、もしaやa/bがまだ存在しなければエラーになります。深い階層のディレクトリを一度に作りたいときは-pを付ける癖をつけておくと便利です。
ワイルドカードで複数のファイルをまとめて指定する
*は「任意の文字列」を表すワイルドカード(特殊記号)です。ファイル名の一部と組み合わせることで、複数のファイルを一度に指定できます。
$ ls *.txt # 拡張子が .txt のファイルだけを表示
memo.txt readme.txt
$ find . -name "*.txt" # カレントディレクトリ以下から .txt ファイルを検索
find はディレクトリツリー全体を検索できるコマンドで、-name オプションでファイル名のパターンを指定します。cp や mv、rm などほとんどのコマンドでワイルドカードは使えるので、覚えておくと大量のファイルをまとめて操作するときに便利です。
ワイルドカードには*以外にも記号があります。よく使うものを表にまとめます。
| 記号 | 意味 |
|---|---|
* | 0文字以上の任意の文字列(例: *.txt はtxtで終わる全ファイル) |
? | 任意の1文字(例: memo?.txt は memo1.txt や memoA.txt に一致) |
[abc] | a・b・cのいずれか1文字に一致 |
ただし、練習用ターミナルの一部コマンド(lsやcpなど)は簡易的な実装のため、実機のシェルほど幅広いワイルドカード展開には対応していません。find -nameのパターン検索は本サイトのターミナルでも利用できるので、まずはこちらで感覚をつかんでみましょう。
history と入力すると、これまでに実行したコマンドの履歴が番号付きで表示されます。実機のターミナルでは、キーボードの↑キーで直前のコマンドを呼び出すこともできます。本サイトの練習用ターミナルでも、↑・↓キー(スマートフォンでは画面下の履歴ボタン)で過去に打ったコマンドを呼び出せます。
実機のターミナルでは、ファイル名やディレクトリ名を途中まで入力してTabキーを押すと、残りの部分を自動的に補完してくれます。長いファイル名を最後まで正確にタイプする必要がなく、タイプミスも防げるため、実務では非常によく使われる操作です。候補が複数ある場合は、もう一度Tabを押すと候補の一覧が表示されます。
複数の階層を一度に作る・確認する
ここまで紹介したコマンドは、慣れてくると組み合わせて使うことでさらに効率的になります。たとえば新しいプロジェクトを始めるとき、mkdir -p project/src project/docsのように1回のコマンドで複数のディレクトリをまとめて作成できます。またlsにはディレクトリを再帰的に一覧表示する-Rオプションもあり(練習用ターミナルでは非対応です)、深い階層の構成を一度に見渡したいときに便利です。基本コマンドを丸暗記するだけでなく、「組み合わせれば手数を減らせないか」という視点を持っておくと、実務での作業スピードが着実に上がっていきます。
手を動かす小課題
練習用ターミナルで、次の課題を実際に試してみましょう。答えは見出しをクリックすると表示されます。
課題1: mkdir -p practice/subで、深い階層のディレクトリを一度に作ってみましょう。
答え: mkdir -p practice/subと入力します。-pを付けているので、途中のpracticeディレクトリがまだ無くても、エラーにならずにpracticeとpractice/subがまとめて作られます。lsやcd practiceで確認してみましょう。
課題2: find . -name "*.txt"で、カレントディレクトリ以下の.txtファイルを検索してみましょう。
答え: find . -name "*.txt"と入力します。*.txtを引用符で囲んでいるのは、シェルにワイルドカードを展開させず、パターンの形のままfindに渡すためでした。第7章で、この理由を仕組みから詳しく説明します。
課題3: 空のディレクトリを作り、rmdirで削除してみましょう。
答え: mkdir testで作成し、rmdir testで削除します。もしtestの中にファイルを作ってからrmdir testを試すと、「ディレクトリが空ではありません」というエラーになることも確認してみましょう。