新しいサーバーやDockerコンテナに入るたびに、基本的な操作のコマンドをいちいちググり直すのがストレスだったので、自分用に逆引き形式でまとめました。「これをしたいときは、このコマンド」という並びです。全部を暗記するつもりはなく、忘れたらこのメモを検索すれば出てくる、くらいの気持ちで運用しています。
ファイル・ディレクトリの基本操作
| やりたいこと | コマンド | 例 |
|---|---|---|
| 現在地を確認したい | pwd |
pwd |
| ディレクトリの中身を見たい | ls |
ls -la |
| ディレクトリを移動したい | cd |
cd /var/log |
| 1つ上の階層に戻りたい | cd .. |
cd .. |
| ホームディレクトリに戻りたい |
cd / cd ~
|
cd |
| ディレクトリを作りたい | mkdir |
mkdir -p a/b/c |
| 空のファイルを作りたい | touch |
touch memo.txt |
| ファイル・ディレクトリをコピーしたい | cp |
cp -r src/ dst/ |
| ファイル・ディレクトリを移動/名前変更したい | mv |
mv old.txt new.txt |
| ファイルを削除したい | rm |
rm file.txt |
| ディレクトリを削除したい |
rm -r / rmdir
|
rm -rf dir/ |
| ファイルの実体(リンク先)を調べたい | readlink -f |
readlink -f link |
| シンボリックリンクを作りたい | ln -s |
ln -s /path/target link |
rmdirは中身が空のディレクトリしか消せません(試すとDirectory not emptyで怒られます)。中身ごと消したいときはrm -r(確認なしで一気にやるなら-rf)を使いますが、rm -rfは打ち間違えると本当に痛い目を見るので、実行前にカーソルの位置とパスを二度見する癖をつけています。特にパスを変数で組み立てているとき(rm -rf $DIR/*のような書き方)は、$DIRが空文字だと/*になってルート直下を巻き込みかねないので要注意です。
ファイルの中身を見る・編集する
| やりたいこと | コマンド | 例 |
|---|---|---|
| ファイルの中身を全部表示したい | cat |
cat file.txt |
| 長いファイルをスクロールしながら見たい | less |
less file.txt |
| ファイルの先頭だけ見たい | head |
head -n 20 file.txt |
| ファイルの末尾だけ見たい | tail |
tail -n 20 file.txt |
| ログをリアルタイムで追いたい | tail -f |
tail -f app.log |
| ファイルの行数・単語数・文字数を数えたい | wc |
wc -l file.txt |
| ファイルの中身を検索したい | grep |
grep -n "error" file.txt |
| 再帰的にディレクトリ内を検索したい | grep -r |
grep -r "TODO" ./src |
| テキストエディタで編集したい |
nano / vim
|
nano file.txt |
| ファイルを並べ替えたい | sort |
sort -n numbers.txt |
| 重複行を消したい | uniq |
sort file.txt | uniq |
| 特定の列だけ取り出したい | cut |
cut -d ',' -f 1 file.csv |
| 文字列を置換したい | sed |
sed 's/foo/bar/g' file.txt |
| 列指向の処理をしたい | awk |
awk '{print $1}' file.txt |
| 差分を見たい | diff |
diff file1 file2 |
grepは-i(大文字小文字を無視)と-v(マッチしない行を出す)もセットで覚えておくと守備範囲が一気に広がります。sedは-iをつけるとファイルを直接書き換えられて便利ですが、バックアップを取らずに使って痛い目を見たことがあるので、心配なときはsed -i.bakのようにバックアップ付きにするか、一度-iなしで出力を確認してから上書きするようにしています。uniqは隣り合った重複行しか消さないので、sortを挟むのがほぼお約束です。
検索
| やりたいこと | コマンド | 例 |
|---|---|---|
| ファイル名でファイルを探したい | find |
find . -name "*.log" |
| 更新日時で絞り込んで探したい | find |
find . -mtime -1 |
| コマンドの場所を知りたい | which |
which python3 |
| コマンドの詳細な場所・マニュアルを知りたい | whereis |
whereis ls |
権限・所有者
| やりたいこと | コマンド | 例 |
|---|---|---|
| ファイルの権限を変更したい | chmod |
chmod 755 script.sh |
| ファイルの所有者を変更したい | chown |
chown user:group file.txt |
| 管理者権限でコマンドを実行したい | sudo |
sudo apt update |
| 一時的に管理者になりたい | su |
su - |
権限まわりで一番やりがちな事故は、「動かないから」という理由でchmod 777にしてしまうことだと思います。一瞬解決した気にはなりますが、誰でも書き込めてしまう状態になるので、本来は所有者・グループを直すか755や644あたりに留めるのが筋です。
プロセス・システム管理
| やりたいこと | コマンド | 例 |
|---|---|---|
| 実行中のプロセスを見たい | ps |
ps aux |
| プロセスをリアルタイムで監視したい |
top / htop
|
htop |
| プロセスを終了させたい | kill |
kill -9 12345 |
| 名前でプロセスを終了させたい | pkill |
pkill -f node |
| コマンドをバックグラウンドで動かしたい |
& / nohup
|
nohup command & |
| ジョブの状態を確認したい | jobs |
jobs |
| バックグラウンドのジョブをフォアグラウンドに戻したい | fg |
fg %1 |
topはほぼどのサーバーにも最初から入っているので確認用には安心ですが、見やすさでいうとhtopが個人的には好みです(入っていないことも多いので、結局apt install htopする場面がよくあります)。あとkillはいきなり-9(SIGKILL)を打つ癖がついている人が多い印象ですが、本来はシグナルなしのkill(SIGTERM、行儀よく終了する猶予を与えるシグナル)を試してからでも遅くありません。-9は本当に効かないときの最終手段、くらいに考えています。
ディスク・容量
| やりたいこと | コマンド | 例 |
|---|---|---|
| ディスクの空き容量を見たい | df |
df -h |
| ディレクトリ・ファイルのサイズを見たい | du |
du -sh ./* |
| マウント状況を確認したい | mount |
mount | grep sda |
「ディスクが急に埋まった」系のトラブルは、df -hで空き容量を確認してから、du -sh ./*で怪しいディレクトリに潜っていくのがいつものパターンです。
圧縮・アーカイブ
| やりたいこと | コマンド | 例 |
|---|---|---|
| tar.gzにまとめたい | tar |
tar czvf archive.tar.gz dir/ |
| tar.gzを展開したい | tar |
tar xzvf archive.tar.gz |
| zipにまとめたい | zip |
zip -r archive.zip dir/ |
| zipを展開したい | unzip |
unzip archive.zip |
tarのオプションはczvfとxzvfさえ覚えておけば大抵の場面はしのげます(作るときはc、展開するときはx、あとは共通というだけの話です)。
ネットワーク
| やりたいこと | コマンド | 例 |
|---|---|---|
| 疎通確認をしたい | ping |
ping google.com |
| ファイルをダウンロードしたい |
wget / curl
|
curl -O https://example.com/file |
| APIにリクエストを送りたい | curl |
curl -X POST -d '{}' url |
| 開いているポートを確認したい |
ss / netstat
|
ss -tulnp |
| SSHで接続したい | ssh |
ssh user@host |
| リモートにファイルを転送したい | scp |
scp file.txt user@host:/path/ |
netstatは最近のディストリだと最初から入っていないことが増えてきた気がするので、今はssの方を先に試すようにしています。
パッケージ管理(Debian/Ubuntu系)
| やりたいこと | コマンド | 例 |
|---|---|---|
| パッケージ一覧を更新したい | apt update |
sudo apt update |
| パッケージをインストールしたい | apt install |
sudo apt install curl |
| パッケージを削除したい | apt remove |
sudo apt remove curl |
| インストール済みパッケージを更新したい | apt upgrade |
sudo apt upgrade |
apt updateはパッケージリストを最新化するだけで、実際にソフトを更新するのはapt upgradeです。ここを混同して「updateしたのに古いまま」と焦った記憶があります。
環境変数・シェル
| やりたいこと | コマンド | 例 |
|---|---|---|
| 環境変数を確認したい | echo |
echo $PATH |
| 環境変数を一覧表示したい | env |
env |
| 環境変数を設定したい | export |
export MY_VAR=value |
| コマンド履歴を見たい | history |
history |
| エイリアスを設定したい | alias |
alias ll='ls -la' |
| シェルを終了したい | exit |
exit |
exportでその場で設定した変数はシェルを閉じると消えるので、ずっと使いたいなら.bashrcや.zshrcに書いておくのを忘れずに。aliasも同じです。
ユーザー情報
| やりたいこと | コマンド | 例 |
|---|---|---|
| 今のユーザー名を知りたい | whoami |
whoami |
| ユーザーIDやグループを知りたい | id |
id |
| ログイン中のユーザー一覧を見たい |
who / w
|
w |
その他便利系
| やりたいこと | コマンド | 例 |
|---|---|---|
| コマンドの使い方(マニュアル)を見たい | man |
man ls |
| 前のコマンドの終了ステータスを確認したい | echo $? |
echo $? |
| 2つのコマンドを繋げて実行したい |
|(パイプ) |
ls | grep txt |
| コマンドの出力をファイルに保存したい |
> / >>
|
ls > list.txt |
| 標準入力からコマンド引数を作りたい | xargs |
find . -name "*.tmp" | xargs rm |
| システムを再起動したい | reboot |
sudo reboot |
| システムをシャットダウンしたい | shutdown |
sudo shutdown -h now |
>は上書き、>>は追記です。ログファイルのつもりで>を使って中身を消し飛ばした経験がある人は多いはず(自分も一度やりました)。find ... | xargs rmは強力な分、まずfindだけを実行して対象が想定通りか確認してからxargs rmをつなげるようにしています。
思い出したら随時追記していくメモなので、抜けているコマンドに気づいたら都度足していく予定です。困ったときはとりあえずman <コマンド名>か<コマンド名> --helpを叩けば大体何とかなります。