コンテンツにスキップ

1-3. 演習問題


1-1. 現在いるディレクトリを確認するコマンドはどれか。

  • A. ls
  • B. pwd
  • C. cd

1-2. 以下のコマンドの説明として正しいのはどれか。

Terminal window
$ cat access.log | grep "ERROR" | wc -l
  • A. access.log の全行数を数える
  • B. access.log の中で “ERROR” を含む行の数を数える
  • C. access.log に “ERROR” という文字を追加する

1-3. rm -r mydir コマンドの説明として正しいのはどれか。

  • A. mydir を空にする
  • B. mydir ディレクトリとその中身を全て削除する
  • C. mydir を別の場所へ移動する

以下の操作を行うコマンドを書いてください。

  1. 現在のディレクトリに work というディレクトリを作成する
  2. work ディレクトリに移動する
  3. notes.txt という空のファイルを作成する
  4. notes.txt に “Hello, World!” という文字を書き込む
  5. notes.txt の内容を表示する
  6. 1つ上のディレクトリに戻る
  7. work ディレクトリを中身ごと削除する
解答欄

現在地が /c/Users/student/practice/demo のとき、以下のパスが指す絶対パスを答えてください。

  1. ./README.md
  2. ../
  3. ../../Documents
  4. ~/Desktop~/c/Users/student とする)
解答欄

以下のコマンドを見て、それぞれ何をするコマンドか説明してください。

Terminal window
# (1)
$ ls -la | grep "^d"
# (2)
$ echo "start" > log.txt && echo "end" >> log.txt
# (3)
$ find . -name "*.java" | wc -l
解答欄

5-1. PATH 環境変数の役割を説明してください。

解答欄

5-2. パイプ(|)を使うメリットを説明してください。

解答欄

5-3. >>> の違いを説明してください。

解答欄

実際にターミナルで以下の操作を行ってください。

課題1:ディレクトリ構成を作る

以下のディレクトリ構成を、ホームディレクトリの下に1つのコマンドで作成してください(ヒント:mkdir -p)。

~/practice/
├── src/
└── docs/

課題2:ファイルを操作する

  1. ~/practice/docs/memo.txt を作成し、“学習中” と書き込む
  2. ~/practice/docs/memo.txt の内容を確認する
  3. ~/practice/docs/memo.txt~/practice/src/ にコピーする

課題3:検索する

  1. ~/practice 以下で .txt 拡張子のファイルを全て検索して表示する
  2. ~/practice/docs/memo.txt の中に “学習” という文字が含まれているか grep で確認する

課題4:環境変数

  1. PRACTICE_DIR という環境変数に ~/practice のパスを設定する
  2. 設定した環境変数の値を表示する

問題1の解答(クリックで開く)

1-1. 正解:B. pwd

解説

  • A の ls は現在のディレクトリの**中身(ファイル一覧)**を表示するコマンド。「今どこにいるか」ではなく「今いる場所に何があるか」を確認するもの。
  • B の pwd(Print Working Directory)が現在地のパスを表示する正解。
  • C の cd(Change Directory)はディレクトリを移動するコマンドで、表示はしない。
Terminal window
$ pwd
/c/Users/student/practice/demo 現在地のフルパスが出力される

1-2. 正解:B. access.log の中で “ERROR” を含む行の数を数える

解説:パイプを追いかける

Terminal window
cat access.log | grep "ERROR" | wc -l

パイプ(|)は左のコマンドの出力を右のコマンドの入力に渡す。

cat access.log → ファイル全行を出力
↓ パイプ
grep "ERROR" → "ERROR" を含む行だけを絞り込む
↓ パイプ
wc -l → 行数を数える(-l は lines の意味)
↓ 最終出力
42(など、該当行数)

A(全行数)は wc -l < access.log または cat access.log | wc -l。C(追加)は echo "ERROR" >> access.log


1-3. 正解:B. mydir ディレクトリとその中身を全て削除する

解説

  • A は誤り。ディレクトリを空にするコマンドは標準では存在しない(中身を個別に削除するか rm -r で一括削除)。
  • B が正しい。rm -r-r は「再帰的(recursive)」の意味で、ディレクトリの中身も含めて全て削除する。
  • C の移動は mv コマンド。

注意rm -r は元に戻せない。エクスプローラーのごみ箱とは異なり、削除は即時・永続的。

Terminal window
rm -r mydir # 危険:確認なしに削除
rm -ri mydir # 安全:削除前に確認を求める(-i = interactive)
問題2の解答(クリックで開く)
Terminal window
mkdir work # (1) work ディレクトリを作成
cd work # (2) work に移動
touch notes.txt # (3) 空のファイルを作成
echo "Hello, World!" > notes.txt # (4) 文字を書き込む(上書き)
cat notes.txt # (5) 内容を表示
cd .. # (6) 1つ上へ戻る
rm -r work # (7) work ごと削除

各コマンドの補足

touch は本来「ファイルの更新日時を現在時刻に変更する」コマンドだが、ファイルが存在しない場合は空のファイルを新規作成する。そのため「空のファイルを作る」用途によく使われる。

echo "..." > file は「文字列を標準出力に出し、それをファイルにリダイレクトする」という2段階の動作。echo 自体には書き込む機能はなく、> がファイルへの書き込みを担当している。

cd .... は「1つ上のディレクトリ」を表す特殊な記法。cd ../.. で2つ上など連結できる。

問題3の解答(クリックで開く)

現在地:/c/Users/student/practice/demo

1. ./README.md/c/Users/student/practice/demo/README.md

. は「現在のディレクトリ」を表す記号。./README.md は「今いる場所にある README.md」という意味。

2. ..//c/Users/student/practice/

.. は「1つ上のディレクトリ」を表す記号。demo の1つ上は practice

3. ../../Documents/c/Users/student/Documents

../../ で2つ上へ遡る(demopracticestudent)。そこから Documents に入る。

/c/Users/student/practice/demo (現在地)
↑ .. → /c/Users/student/practice
↑ ../.. → /c/Users/student
/c/Users/student/Documents ← そこへ Documents をつなぐ

4. ~/Desktop/c/Users/student/Desktop

~(チルダ)はホームディレクトリ(/c/Users/student)の省略記法。現在地に関わらず常に同じ場所を指す。

問題4の解答(クリックで開く)

(1) ls -la | grep "^d"

ls -la の出力例:

drwxr-xr-x 1 student 197121 0 Mar 20 10:00 site ← d で始まる(ディレクトリ)
-rw-r--r-- 1 student 197121 512 Mar 20 10:00 README.md ← - で始まる(ファイル)

grep "^d"^ は「行頭」を意味する正規表現。先頭が d の行(=ディレクトリ)だけを絞り込む。 結果:ディレクトリ一覧のみ表示する。


(2) echo "start" > log.txt && echo "end" >> log.txt

記号意味
>上書きリダイレクト(既存内容は消える)
>>追記リダイレクト(既存内容は保持される)
&&左のコマンドが成功したら右を実行する

実行後の log.txt の内容:

start
end

(3) find . -name "*.java" | wc -l

find . -name "*.java" はカレントディレクトリ以下のすべての .java ファイルのパスを1行ずつ出力する。 wc -l でその行数(= ファイル数)を数える。 結果:カレントディレクトリ以下にある .java ファイルの総数を表示する。

問題5の解答例(クリックで開く)

5-1. PATH 環境変数の役割

コマンドを入力すると、シェルは PATH に含まれるディレクトリを左から順に探してプログラムを実行する。

Terminal window
$ echo $PATH
/mingw64/bin:/usr/bin:/c/Program Files/nodejs
$ git
# → /mingw64/bin/git を探す → なければ /usr/bin/git → なければ /c/Program Files/nodejs/git
# → 見つかったものを実行

PATH に含まれていないディレクトリのプログラムはフルパスで指定しないと実行できない。新しいツールをインストールしたあと「コマンドが見つからない」エラーが出る場合、そのツールのディレクトリが PATH に含まれていないことが原因の代表例である。


5-2. パイプ(|)を使うメリット

① 複数のコマンドを組み合わせて複雑な処理を実現できる 単一のコマンドでは難しい処理も、小さなコマンドを組み合わせることで実現できる。Unix の設計哲学「一つのことをうまくやれ(Do one thing well)」を体現している。

② 中間ファイルが不要で効率的

Terminal window
# パイプなし(中間ファイルが必要)
cat access.log > /tmp/tmp1.txt
grep "ERROR" /tmp/tmp1.txt > /tmp/tmp2.txt
wc -l /tmp/tmp2.txt
rm /tmp/tmp1.txt /tmp/tmp2.txt
# パイプあり(1行で完結)
cat access.log | grep "ERROR" | wc -l

5-3. >>> の違い

記号動作既存内容
>上書き消える
>>追記保持される
Terminal window
echo "1行目" > file.txt
echo "2行目" > file.txt
echo "3行目" >> file.txt

ログファイルへの記録には >> を使う。> を使うと古いログが消えてしまう。

問題6の解答例(クリックで開く)

課題1:ディレクトリ構成を一度に作る

Terminal window
mkdir -p ~/practice/src ~/practice/docs

-p オプションの役割:

  • 中間ディレクトリ(practice)が存在しない場合でも自動的に作成する
  • 既にディレクトリが存在してもエラーにならない

-p なしで mkdir ~/practice/src を実行すると、~/practice がない場合にエラーになる。


課題2:ファイル操作

Terminal window
echo "学習中" > ~/practice/docs/memo.txt
cat ~/practice/docs/memo.txt
cp ~/practice/docs/memo.txt ~/practice/src/

cp 元ファイル 先ディレクトリ/ と書くと、同じファイル名でコピー先に配置される。 cp ~/practice/docs/memo.txt ~/practice/src/memo_copy.txt のように名前を変えてコピーすることもできる。


課題3:検索

Terminal window
find ~/practice -name "*.txt"
grep "学習" ~/practice/docs/memo.txt

grep が一致した場合はその行を出力する。一致しなかった場合は何も出力しない。 find ~/practice -name "*.txt" なら、今回作成した memo.txt を含む .txt ファイル一覧を確認できる。


課題4:環境変数

Terminal window
export PRACTICE_DIR=~/practice
echo $PRACTICE_DIR

export は環境変数を設定するためのコマンドである。 PRACTICE_DIR=~/practice のように値を代入すると、後から $PRACTICE_DIR で参照できる。 ここでは講義で学んだ export~ を組み合わせており、$(...) のような別の構文は使っていない。