新卒エンジニアが最初に覚えるLinuxコマンドと危ないオプション
よく使うコマンドと、Enter の前に止まるべき使い方をセットで覚える。
最初に覚えるコマンドは 12 個で足りる
Linux のサーバーにログインして作業する場面は、開発環境の構築、ログの確認、障害の調査など、新卒のうちから頻繁にあります。コマンドは数百ありますが、最初の数か月で使うものは限られています。この記事では、移動と一覧、ファイル操作、検索と閲覧、権限とプロセスの 4 分野で 12 個のコマンドを整理し、それぞれの「危ない使い方」を合わせて紹介します。
Linux のコマンドは、Windows のエクスプローラーのように確認ダイアログを出さないものが多くあります。上書きや削除が一瞬で終わり、元に戻せないこともあります。便利なオプションを覚えるのと同じくらい、Enter を押す前に止まるべきパターンを知っておくことが大切です。オプションの詳細は、man コマンド(man ls など)や --help で確認できます。
| コマンド | 主な用途 | よく使う形 | 注意点 |
|---|---|---|---|
| ls | ファイルの一覧 | ls -la | -a を付けないと . で始まる隠しファイルは表示されない |
| cd | ディレクトリの移動 | cd /var/log、cd -、cd | 引数なしの cd はホームディレクトリに戻る |
| cp | コピー | cp -r src backup | ディレクトリには -r が必要。同名ファイルは確認なしで上書き |
| mv | 移動・名前の変更 | mv old.txt new.txt | 同名ファイルは確認なしで上書き |
| rm | 削除 | rm file.txt、rm -r dir | ゴミ箱はない。-rf は確認なしで再帰削除 |
| grep | 文字列の検索 | grep -rn "ERROR" ./logs | -i で大文字小文字を区別しない、-v で一致しない行 |
| find | ファイルの検索 | find . -name "*.log" -type f | -delete を付けると見つけたものをすぐ削除する |
| less | ファイルの閲覧 | less app.log | q で終了、/ で検索。巨大なファイルも開ける |
| tail | 末尾の表示・追跡 | tail -n 100 app.log、tail -f app.log | -f は Ctrl+C で止めるまで追い続ける |
| chmod | 権限の変更 | chmod 755 run.sh、chmod u+x run.sh | 777 は誰でも書き換え可能になる |
| ps | プロセスの一覧 | ps aux | ps aux | grep の結果には grep 自身が混ざることがある |
| kill | プロセスへのシグナル送信 | kill 1234 | -9 は後片付けなしの強制終了 |
移動・一覧とファイル操作:上書きと削除に注意
ls と cd は毎日使うコマンドです。ls -l は権限や所有者、サイズ、更新日時を表示し、-a は . で始まる隠しファイル(.env や .gitignore など)も表示します。設定ファイルの多くは隠しファイルなので、ls だけで「ファイルがない」と判断しないようにします。cd - は直前にいたディレクトリに戻り、引数なしの cd はホームディレクトリに戻ります。作業の前に pwd で現在の場所を確かめる習慣は、後述の rm の事故を防ぎます。
cp と mv は確認なしで上書きする
cp と mv は、コピー先や移動先に同じ名前のファイルがあると、既定では何も聞かずに上書きします。設定ファイルを退避するつもりで cp app.conf app.conf.bak を実行し、すでにあった古いバックアップを消してしまう、という事故が起こりえます。-i を付けると上書き前に確認し、-n を付けると上書きしません(GNU coreutils の場合)。ディレクトリをコピーするには -r が必要で、付けないとディレクトリは飛ばされます。
# 悪い例:既存の .bak を確認なしで上書きするcp /etc/app/app.conf /etc/app/app.conf.bak# 良い例:日付を付けて名前の衝突を避け、-i で上書き前に確認するcp -i /etc/app/app.conf /etc/app/app.conf.$(date +%Y%m%d)ls -l /etc/app/rm には「ゴミ箱」がない
rm で削除したファイルは、通常の方法では元に戻せません。-r はディレクトリの中身を再帰的に削除し、-f は確認や存在しないファイルのエラーを省略します。組み合わせた rm -rf は、指定したパスの下を何も聞かずにすべて削除します。特に危ないのは、変数を使ったパスとワイルドカードです。変数が空のまま rm -rf "$DIR"/* を実行すると、rm -rf /* と同じ意味になります。cd に失敗したまま rm -rf * を実行すると、意図しない現在のディレクトリの中身が消えます。
cd build ; rm -rf *rm -rf $OLD_DIR/*cd build && rm -rf ./*: "${OLD_DIR:?OLD_DIR is empty}" # 空なら止まるls "$OLD_DIR" # 消す前に中身を確認rm -rf -- "$OLD_DIR"/*rm、mv、cp で本番サーバーのファイルを扱うときは、pwd で現在の場所、ls で対象の中身を確かめてから実行します。パスに変数やワイルドカードが含まれるなら、先に echo や ls で展開結果を表示して、想定どおりかを見ます。手順書の通りでも、ホスト名とパスの読み違いはよく起きます。
検索と閲覧:grep・find・less・tail -f
grep はファイルの中から文字列を含む行を探します。-r でディレクトリを再帰的に、-n で行番号付き、-i で大文字小文字を区別せず、-v で一致しない行を表示し、-c で一致した行数を数えます。find はファイル名や種類、更新日時などの条件でファイルそのものを探します。grep は「中身」、find は「ファイル名や属性」を探す、と区別すると使い分けやすくなります。
ログの閲覧には less と tail が便利です。less は巨大なファイルでも全体を読み込まずに開けるので、数 GB のログをエディタで開いてサーバーのメモリを圧迫するような事態を避けられます。tail -n 100 は末尾 100 行、tail -f はファイルに追記される内容をリアルタイムで表示し続けます。tail -f は Ctrl+C で止めるまで終わらないので、止め方を覚えてから使います。
find . -name "*.tmp" -delete は、見つけたファイルをその場で削除します。-name の条件を間違えると、必要なファイルまで消えます。まず -delete を付けずに実行して一覧を確認し、想定どおりなら付け足す、という順番にします。find ... | xargs rm も同様で、ファイル名に空白が含まれると意図しない名前で rm が実行されることがあるため、find -print0 と xargs -0 を組み合わせます。
パイプとリダイレクト:> と >> の違い
パイプ(|)は、左のコマンドの標準出力を右のコマンドの標準入力に渡します。grep で絞り、sort で並べ、uniq -c で数え、head で先頭だけを出す、というように小さなコマンドをつないで処理を組み立てられます。注意したいのは、パイプが渡すのは標準出力だけで、エラーメッセージが出る標準エラー出力は渡らない点です。両方を渡したいときは 2>&1 を使います。
| 書き方 | 意味 |
|---|---|
| cmd > out.txt | 標準出力をファイルに書く。既存の内容は消える |
| cmd >> out.txt | 標準出力をファイルの末尾に追記する |
| cmd 2> err.txt | 標準エラー出力をファイルに書く |
| cmd > out.txt 2>&1 | 標準出力と標準エラー出力の両方を out.txt に書く |
| cmd 2>&1 | tee build.log | 両方を画面に表示しつつ build.log にも保存する |
| cmd 2>/dev/null | 標準エラー出力を捨てる |
> と >> の取り違えは、気づきにくい事故の原因になります。ログや設定ファイルに追記するつもりで > を使うと、それまでの内容が消えます。また、2>&1 の位置によって意味が変わります。cmd > out.txt 2>&1 は両方をファイルへ送りますが、cmd 2>&1 > out.txt は標準エラー出力が画面に残ります。リダイレクトは左から順に処理されるためです。
grep -c "ERROR" app.log # ERROR を含む行数awk '{print $1}' access.log | sort | uniq -c | sort -rn | head -5./build.sh >> build.log 2>&1 # 既存のログを消さずに追記echo "export APP_ENV=dev" >> ~/.bashrc # > にすると .bashrc が消える権限とプロセス:chmod 777 と kill -9 を気軽に使わない
chmod はファイルの権限を変えます。755 は所有者が読み書き実行、グループとその他が読み実行、644 は所有者が読み書き、ほかは読みのみです。u+x のような記号表記なら、所有者にだけ実行権限を足し、他の権限は変えません。Permission denied が出たときに chmod 777 で解決しようとするのは避けます。777 は誰でも書き換えられる状態で、スクリプトなら第三者に中身を差し替えられるおそれがあります。必要な権限だけを足すのが原則です。
ps aux は動いているプロセスの一覧を表示し、grep と組み合わせて目的のプロセスを探します。kill はプロセスにシグナルを送るコマンドで、既定の SIGTERM は「終了してください」という依頼です。プロセスは一時ファイルの削除や接続の切断などの後片付けをしてから終わることができます。kill -9 は SIGKILL を送り、後片付けの機会を与えずに止めます。書き込み中のデータが壊れることもあるため、まず kill を試し、止まらないときに -9 を検討します。kill する前に、PID が本当に目的のプロセスかを ps で確かめます。
危ないコマンドを実行する前のチェックリスト
- ホスト名とユーザーを確かめたか(本番か検証環境か、sudo が必要か)
- pwd で現在のディレクトリを確かめたか
- rm、mv、cp の対象を ls で確かめたか
- パスの変数やワイルドカードの展開結果を echo で確かめたか
- find に -delete を付ける前に、付けずに一覧を確かめたか
- ファイルへの出力が > ではなく >> であるべきではないか
- chmod 777 ではなく、必要な権限だけを足しているか
- kill の PID が目的のプロセスか、-9 が本当に必要か
問題で確かめる
この記事の内容を、制限時間つきの問題で確かめられます。
- 隠しファイルも含めて詳細(長い形式)で一覧する。空欄は?Linux・シェル / 記述
- src はディレクトリ。次のコマンドを実行すると?Linux・シェル / 4 択
- b.txt が既に存在するとき、
mv a.txt b.txtは確認なしで b.txt を上書きするLinux・シェル / ○× rm -rf /tmp/work/*は確認なしで /tmp/work の中身を削除するLinux・シェル / ○×- 大文字小文字を区別せずに error を含む行を探す。空欄のオプションは?Linux・シェル / 記述
- ERROR を含まない行だけを表示する。空欄のオプションは?Linux・シェル / 記述
- 次のコマンドが表示するものは?Linux・シェル / 4 択
chmod 755 run.shの後、ls -lで表示される権限は?Linux・シェル / 4 択- 他の権限は変えず、所有者にだけ実行権限を追加する記号表記は?Linux・シェル / 記述
- ./run.sh で Permission denied と出た。適切な対処は?Linux・シェル / 4 択
- 次を順に実行したとき、最後の cat の出力は?Linux・シェル / 4 択
- 既存の build.log を消さずに、末尾に出力を追記する記号は?Linux・シェル / 記述
- 次のコマンドの標準エラー出力はどこへ行く?Linux・シェル / 4 択
- cmd1 | cmd2 のパイプは、cmd1 の標準エラー出力も cmd2 の標準入力へ渡すLinux・シェル / ○×
kill 1234とkill -9 1234の違いは?Linux・シェル / 4 択ps aux | grep nginxの結果には、grep nginx自身の行が混ざることがあるLinux・シェル / ○×- build が無いとカレントのファイルが消える。このスクリプトへの指摘として正しいものは?Linux・シェル / 4 択