はじめに
Linux では、データをディレクトリとファイルのツリー構造で管理します。コマンドはこのツリー内の場所を対象に動作するため、ファイルを確実に操作するには、次の 3 つを確認することが重要です。現在どこにいるか、そこに何があるか、操作したい項目を特定するパスは何か、という点です。
この実験では、/home/labex/project/file-basics を使って、これらの考え方を段階的に学びます。絶対パスと相対パスを使って移動し、表示項目と隠し項目を確認し、ファイルとディレクトリを作成します。また、ワイルドカードで名前を選択し、練習用ファイルを安全にコピー、移動、削除します。最後に、操作の意味を変えずに作業を速くするターミナルショートカットを紹介します。
作業ディレクトリを確認する
このステップでは、ターミナルのプロンプトと、コマンドが操作対象にするディレクトリの関係を確認します。
シェルには常に現在の作業ディレクトリがあります。相対パスはそのディレクトリを起点にするため、現在地を確認することで、初心者によくある間違いを防げます。この実験のワークスペースへ、完全なパスを使って移動します。
cd /home/labex/project/file-basics
/ で始まるパスを絶対パスと呼びます。絶対パスはファイルシステムのルートから始まり、最初にいた場所に関係なく同じ場所を指します。
現在の作業ディレクトリを表示します。
pwd
次のように表示されます。
/home/labex/project/file-basics
この場所を証拠として保存します。> 演算子は出力を starting-location.txt にリダイレクトします。今回は出力先がファイルなので、画面には何も表示されません。
pwd > starting-location.txt
ファイルを読み取り、保存内容を確認します。
cat starting-location.txt
ターミナル画面とファイルには、同じ絶対パスが表示されるはずです。
相対パスで移動する
このステップでは、相対パスと特殊な名前 . および .. を使って、隣接するディレクトリ間を移動します。
必要に応じて、ワークスペースに戻ります。
cd /home/labex/project/file-basics
ワークスペース内の表示項目を一覧表示します。
ls
path-map と starting-location.txt が表示されるはずです。現在のディレクトリを基準に解釈される相対パスを使って、path-map に入ります。
cd path-map
pwd
次に north に入り、参照ファイルを読み取ります。
cd north
cat reference.txt
出力は north reference です。.. は親ディレクトリ、つまり現在の場所の 1 つ上のディレクトリを表します。
cd ..
path-map から、その中にある south ディレクトリへ移動します。
cd south
cat reference.txt
. は現在のディレクトリを表します。pwd の出力と、2 階層上へ移動する相対的な保存先を組み合わせて、現在の絶対パスを実験のルートに保存します。
pwd > ../../relative-location.txt
絶対パスを使って、実験のルートへ直接戻ります。
cd /home/labex/project/file-basics
cat relative-location.txt
保存されたパスは /path-map/south で終わるはずです。ここでは、相対パスによる移動と、絶対パスによる帰還の両方を使いました。
ディレクトリの内容を確認する
このステップでは、ls のオプションを使って、隠し名前やファイルの詳細を表示します。
実験のルートで通常の一覧表示を実行します。
cd /home/labex/project/file-basics
ls
Linux では通常、ドットで始まる名前は隠されています。-a オプションは「all」を意味し、隠し項目も含めて表示します。
ls -a
.practice-note に加えて、現在のディレクトリを表す . と、親ディレクトリを表す .. も表示されるはずです。
-l オプションを使うと、権限、所有者、サイズ、時刻、名前を含む詳細な一覧表示になります。
ls -l
オプションを組み合わせて、すべての項目を詳細形式で確認します。
ls -la
出力の各行は、種類と権限を示すフィールドで始まります。先頭が d の項目はディレクトリ、先頭が - の項目は通常のファイルです。権限については後の実験で詳しく学びます。
隠し項目を含む名前を保存します。この管理されたワークスペースでは、ls がすでに名前をアルファベット順に表示するため、現時点では追加のソートコマンドは必要ありません。
ls -A > all-names.txt
-a とは異なり、-A は特殊な . と .. を除外し、それ以外の隠し項目は保持します。結果を表示します。
cat all-names.txt
一覧には .practice-note、path-map、および前のステップで作成したファイルが含まれるはずです。
ディレクトリとファイルを作成する
このステップでは、小さなプロジェクトツリーを作成し、通常のファイルにテキストを書き込みます。
mkdir はディレクトリを作成します。-p オプションを使うと、存在しない親ディレクトリも作成できるため、1 つのコマンドでネストしたパスを構築できます。
cd /home/labex/project/file-basics
mkdir -p workspace/docs workspace/logs
これにより、workspace と、その中の docs および logs が作成されます。結果を確認します。
find workspace -maxdepth 2 -type d
touch は、指定した名前のファイルが存在しない場合に空のファイルを作成します。2 つのファイルを同時に作成します。
touch workspace/docs/guide.txt workspace/logs/app.log
ガイドファイルに内容を書き込みます。単一の > は、コマンドの出力で保存先を置き換えます。
echo "Linux file practice" > workspace/docs/guide.txt
>> を使って 2 行目を追加します。>> は既存の内容を保持します。
echo "Paths make locations predictable" >> workspace/docs/guide.txt
ファイル全体を読み取ります。
cat workspace/docs/guide.txt
元の順序で 2 行とも表示されるはずです。空の app.log も存在しており、後でワイルドカードの練習に使用します。
ワイルドカードで名前を選択する
このステップでは、ファイルのグループを作成し、ファイル名のパターンで選択します。
logs ディレクトリに移動します。
cd /home/labex/project/file-basics/workspace/logs
ブレース展開は、コマンドを実行する前に複数のリテラル名を生成します。番号付きのログを作成します。
touch app{1..3}.log worker{1..2}.log notes.txt
シェルは {1..3} を 1 2 3 に展開するため、app{1..3}.log は 3 つの引数になります。
ワイルドカードは、すでに存在する名前に一致させる点が異なります。* は任意の長さの文字列に一致します。
ls *.log
出力には .log で終わるすべての名前が含まれますが、notes.txt は含まれません。
? ワイルドカードは、ちょうど 1 文字に一致します。番号付きの app ログだけを一覧表示します。
ls app?.log
シェルはファイル名のパターンをアルファベット順に展開します。printf は展開された各名前を 1 行ずつ表示し、> はその行を保存します。
printf '%s\n' *.log > matched-logs.txt
cat matched-logs.txt
保存された一覧には、app.log、app1.log、app2.log、app3.log、worker1.log、worker2.log が含まれるはずです。*.log を引用符で囲むとワイルドカード展開が無効になるため、ここでは意図的に引用符を付けていません。
ファイルを安全にコピー、移動、削除する
このステップでは、次のチャレンジで使用する前に、cp、mv、rm の効果を比較します。
ワークスペースディレクトリに戻ります。
cd /home/labex/project/file-basics/workspace
cp SOURCE DESTINATION は、コピー元を残したまま別のファイルを作成します。ガイドのバックアップコピーを作成します。
cp docs/guide.txt docs/guide-backup.txt
2 つのファイルの内容が同じであることを確認します。cmp は 2 つのファイルをバイト単位で比較します。一致している場合は何も表示されません。エラーメッセージが表示された場合は、内容が異なります。
cmp docs/guide.txt docs/guide-backup.txt
mv SOURCE DESTINATION は、項目を移動または名前変更します。バックアップをワークスペースのルートへ移動し、より分かりやすい名前を付けます。
mv docs/guide-backup.txt archived-guide.txt
2 つの場所を一覧表示します。
ls docs
ls
docs の下に guide.txt が、現在のディレクトリに archived-guide.txt が表示されるはずです。
rm は指定したファイルを完全に削除します。通常、ターミナルにはごみ箱がありません。使い捨ての notes ファイルだけを削除します。
rm logs/notes.txt
もう一度ディレクトリを一覧表示して、削除を確認できるようにします。
ls logs
notes.txt は表示されなくなるはずです。元のガイドと移動したコピーは引き続き利用できますが、明示的に指定した使い捨てファイルは削除されています。
ターミナルショートカットで作業を速くする
このステップでは、入力を減らし、実行中のコマンドから復帰するのに役立つ 4 つのターミナル操作を練習します。
まず、ドキュメントディレクトリに移動します。
cd /home/labex/project/file-basics/workspace/docs
繰り返し使用するコマンドを実行します。
cat guide.txt
上矢印キー(Up Arrow)を 1 回押します。直前の cat guide.txt コマンドがプロンプトに再表示されるはずです。Enter キーを押して、もう一度実行します。コマンド履歴の呼び出しを使うと、再入力を避けられます。また、実行前に呼び出した行を編集することもできます。
次に、Enter キーを押さずに cat g と入力し、Tab キー(Tab)を押します。一致するのが guide.txt だけなので、シェルがファイル名を補完するはずです。Enter キーを押して、補完されたコマンドを実行します。
次に、継続的に待機するコマンドを開始します。
tail -f /dev/null
tail -f はファイルを追跡し、新しいデータを待ち続けます。/dev/null から有用な行が提供されることはないため、コマンドは何も表示せず停止しているように見えます。Ctrl+Cを押して割り込みを送り、プロンプトに戻ります。フォアグラウンドで実行中のコマンドを停止したい場合、通常はまずこの操作を行います。
Ctrl+Lを押して、画面に表示されている古い出力を消去します。clear と同様に、ファイルやコマンド履歴は削除されません。
プロンプトに戻ったら、完了マーカーを作成します。
echo "Shortcuts practiced" > /home/labex/project/file-basics/shortcuts-complete.txt
cat /home/labex/project/file-basics/shortcuts-complete.txt
このマーカーが表示されれば、対話操作の練習後にプロンプトへ正常に戻れたことを確認できます。
まとめ
作業ディレクトリとパスがファイル操作をどのように制御するかを学びました。絶対パスと相対パスで移動し、隠し項目とメタデータを確認し、ディレクトリツリーとテキストファイルを作成しました。また、ワイルドカードで名前を選択し、コピー、移動、完全削除の違いを比較しました。さらに、コマンド履歴の呼び出し、Tab 補完、Ctrl+C、Ctrl+L も練習しました。次の実験では、見慣れないコマンドやオプションが出てきたときに、信頼できるヘルプを見つける方法を学びます。



