UNIXコマンド図鑑
長かったので分けた
ファイル・ディレクトリの操作
pwd
print working directory
現在いるディレクトリ(カレントディレクトリ)の絶対パスを表示する.
-L(Logical):シンボリックリンクをたどったままのパスを表示する(多くのシェルでのデフォルト)-P(Physical):シンボリックリンクを解決した実際のパスを表示する
$ pwd
/home/user/projects
ls
list
ディレクトリの中身を一覧表示する.引数にはディレクトリやファイルのパスを渡し,ディレクトリならその中身を,ファイルならそのファイル自体を表示する.引数は複数指定でき,*.txt のようなワイルドカードも使える.引数を省略するとカレントディレクトリの中身を表示する.
-l(long):パーミッション,所有者,サイズ,更新日時などを含む詳細表示-a(all):.で始まる隠しファイルも表示する-h(human-readable):-lと組み合わせて,サイズを4.0Kのように読みやすい単位で表示する-t(time):更新日時の新しい順に並べる-r(reverse):並び順を逆にする-S(Size):サイズの大きい順に並べる-R(Recursive):サブディレクトリの中身も再帰的に表示する-d(directory):ディレクトリの中身ではなく,ディレクトリ自体の情報を表示する
$ ls /etc
$ ls -l *.txt src/
$ ls -lah
$ ls -ltr # 更新日時の古い順に詳細表示(最新のものが一番下に来る)
cd
change directory
カレントディレクトリを移動する.シェルの組み込みコマンドである.
cd ディレクトリ:指定したディレクトリに移動cd ..:1つ上のディレクトリに移動cdまたはcd ~:ホームディレクトリに移動cd -:直前にいたディレクトリに戻る
オプションはほとんど使わないが,pwd と同様に -L(Logical)と -P(Physical)があり,-P を付けるとシンボリックリンクを解決した実際のディレクトリに移動する.
mkdir
make directory
ディレクトリを作成する.
-p(parents):途中の親ディレクトリがなければまとめて作成する.すでに存在していてもエラーにならない-m(mode):作成するディレクトリのパーミッションを指定する-v(verbose):作成したディレクトリを1つずつ表示する
$ mkdir -p src/components/button
$ mkdir -m 700 secret
touch
本来はファイルに「触れて(touch)」更新日時を現在時刻に変更するコマンドだが,指定したファイルが存在しない場合は空のファイルを作成するため,空ファイルの作成によく使われる.
-a(access):アクセス日時だけを変更する-m(modification):更新日時だけを変更する-c(no-create):ファイルが存在しない場合に新しく作成しない-t(time):現在時刻ではなく,指定した日時に設定する
$ touch index.html
$ touch -t 202601011200 old.txt # 2026年1月1日12:00に設定
cp
copy
ファイルをコピーする.
-r/-R(recursive):ディレクトリを中身ごと再帰的にコピーする-i(interactive):コピー先に同名のファイルがあるとき,上書きしてよいか確認する-f(force):確認せずに強制的に上書きする-n(no-clobber):コピー先に同名のファイルがあれば上書きしない-p(preserve):パーミッションや更新日時などの属性を保ったままコピーする-v(verbose):コピーしたファイルを1つずつ表示する
$ cp a.txt b.txt # a.txt を b.txt としてコピー
$ cp -r src/ backup/ # ディレクトリごとコピー
mv
move
ファイルやディレクトリを移動する.移動先に別の名前を指定すれば名前の変更にもなる.ディレクトリも -r なしでそのまま移動できる.
-i(interactive):移動先に同名のファイルがあるとき,上書きしてよいか確認する-f(force):確認せずに強制的に上書きする-n(no-clobber):移動先に同名のファイルがあれば上書きしない-v(verbose):移動したファイルを1つずつ表示する
$ mv old.txt new.txt # 名前の変更
$ mv -i new.txt docs/ # docs ディレクトリへ移動(上書き時は確認)
rm
remove
ファイルを削除する.
-r/-R(recursive):ディレクトリを中身ごと再帰的に削除する-f(force):確認せずに強制的に削除する.存在しないファイルを指定してもエラーにしない-i(interactive):削除前に1つずつ確認する-d(directory):空のディレクトリを削除する-v(verbose):削除したファイルを1つずつ表示する
rmで削除したファイルはゴミ箱に入らず,基本的に元に戻せない. 特に rm -rf は対象を間違えると取り返しがつかないので注意する.
$ rm memo.txt
$ rm -ri old_dir/ # 中身を1つずつ確認しながら削除
ファイルの中身を見る
cat
concatenate
ファイルの内容をそのまま標準出力に表示する.本来は複数のファイルを連結するためのコマンドである.
-n(number):すべての行に行番号を付ける-b(number-nonblank):空行以外の行にだけ行番号を付ける-s(squeeze-blank):連続する空行を1行にまとめる
$ cat -n a.txt
$ cat a.txt b.txt > ab.txt # 2つのファイルを連結して保存
less
ファイルの内容を1画面ずつ表示するページャである.長いファイルを読むときに使う.先に存在したページャ more の改良版として作られ,名前は「less is more」というしゃれに由来する.
起動後は次のキーで操作する.
Space/b:次のページ/前のページg/G:先頭/末尾へ移動/文字列:下方向に検索(nで次の一致,Nで前の一致)q:終了
起動時の主なオプションは次のとおり.
-N(line Numbers):行番号を表示する-S(chop long lines):長い行を折り返さずに切り詰めて表示する(長い形式は--chop-long-lines)-i(ignore-case):検索で大文字と小文字を区別しない(検索語に大文字が含まれる場合は区別する)-R(RAW-CONTROL-CHARS):色付けのための制御文字をそのまま解釈して色を表示する
$ less -N long_log.txt
head・tail
head はファイルの先頭を,tail は末尾を表示する.どちらもデフォルトでは10行表示する.
両方に共通する主なオプションは次のとおり.
-n(number of lines):表示する行数を指定する-c:行数ではなくバイト数で指定する(長い形式は--bytes)
tail には次のオプションもある.
-f(follow):末尾を表示したまま待ち続け,追記された内容をリアルタイムで表示する.ログの監視によく使う-F:-fに加えて,ファイルが作り直された場合も追いかける.ログのローテーションに強い
$ head -n 5 data.csv
$ tail -f /var/log/syslog
検索
find
条件に合うファイルやディレクトリを,指定したディレクトリ以下から再帰的に探す.find の条件はふつうのオプションとは少し性格が異なり,「式(expression)」として並べて書く.複数並べると,すべてを満たすもの(AND)が対象になる.
-name パターン:名前で検索する(*などのワイルドカードが使える)-iname パターン(ignore case):大文字と小文字を区別せずに名前で検索する-type 種類:種類で絞る.f(file)は通常のファイル,d(directory)はディレクトリ,l(symbolic link)はシンボリックリンク-mtime 日数(modification time):更新日時で絞る.-7なら7日以内,+7なら7日より前-size サイズ:サイズで絞る.+100Mなら100MiBより大きいもの-maxdepth 深さ:探索する階層の深さの上限を指定する-exec コマンド {} \;(execute):見つかった各ファイルに対してコマンドを実行する.{}がファイル名に置き換わる-delete:見つかったファイルを削除する
# カレントディレクトリ以下の .md ファイルを探す
$ find . -type f -name "*.md"
# 30日以上更新されていない .log ファイルを削除する
$ find /tmp -name "*.log" -mtime +30 -delete
パターンを " で囲んでいるのは,シェルが * を先に展開してしまうのを防ぐためである.
grep
global regular expression print
ファイルや標準入力から,指定したパターン(正規表現)に一致する行を探して表示する.名前はUNIXの行エディタ ed のコマンド g/re/p に由来し,すべての行(global)から正規表現(regular expression)に一致するものを表示する(print)という意味である.
-i(ignore-case):大文字と小文字を区別しない-n(line-number):行番号を表示する-r(recursive):ディレクトリ以下を再帰的に検索する-v(invert-match):一致しない行を表示する-w(word-regexp):単語全体として一致するものだけを表示する-c(count):一致した行の数だけを表示する-l:一致した行ではなく,一致を含むファイル名だけを表示する(長い形式は--files-with-matches)-o(only-matching):行全体ではなく,一致した部分だけを表示する-E(Extended-regexp):拡張正規表現を使う-A 数/-B 数/-C 数(After / Before / Context):一致した行の後/前/前後の行もあわせて表示する
$ grep -rn "TODO" src/
$ grep -C 3 "Error" app.log
$ ps aux | grep python
テキスト処理
wc
word count
行数,単語数,バイト数を数える.オプションを付けなければ3つすべてを表示する.
-l(lines):行数だけを表示する-w(words):単語数だけを表示する-c:バイト数だけを表示する(長い形式は--bytes)-m:文字数だけを表示する.日本語などのマルチバイト文字を数えるときはこちらを使う(長い形式は--chars)
$ wc -l data.csv
sort
行を並べ替える.デフォルトでは文字列として辞書順に並べる.
-n(numeric-sort):数値として並べる(これを付けないと10が9より前に来る)-r(reverse):逆順にする-k 列(key):並べ替えの基準にする列を指定する-t 文字:列の区切り文字を指定する(長い形式は--field-separator)-u(unique):重複する行を1つにまとめる-f(fold):大文字と小文字を区別しない(小文字を大文字に「折りたたんで」比較する)-h(human-numeric-sort):2Kや1Gのような単位付きの数値を正しく並べる-o ファイル(output):結果をファイルに書き込む
$ sort -n -r scores.txt
$ sort -t ',' -k 2 -n data.csv # CSV を2列目の数値で並べる
uniq
unique
連続して重複している行を1つにまとめる.隣り合った行しか比較しないため,ふつうは sort で並べてから使う.
-c(count):各行の前に出現回数を表示する-d(duplicated):重複している行だけを1つずつ表示する-u(unique):重複していない行だけを表示する-i(ignore-case):大文字と小文字を区別せずに比較する
# 出現回数の多い順に並べる定番の組み合わせ
$ sort access.log | uniq -c | sort -nr
cut
各行から指定した列や文字範囲を切り出す.
-d 文字(delimiter):区切り文字を指定する(デフォルトはタブ)-f 番号(fields):取り出すフィールド(列)の番号を指定する-c 範囲(characters):文字の位置で切り出す-b 範囲(bytes):バイトの位置で切り出す
# CSV の1列目と3列目を取り出す
$ cut -d ',' -f 1,3 data.csv
# 各行の先頭10文字を取り出す
$ cut -c 1-10 data.txt
sed
stream editor
入力を1行ずつ読みながら置換や削除などの編集を行う.最もよく使うのは s/検索/置換/ による置換で,末尾に g(global)を付けると1行の中で一致したものをすべて置換する.
-n:各行を自動で出力しない.p(print)コマンドと組み合わせて,指定した行だけを表示するのに使う(長い形式は--quiet)-e スクリプト(expression):実行する編集コマンドを指定する.複数の編集を並べたいときに使う-E(Extended):拡張正規表現を使う-i(in-place):結果を出力せず,ファイルを直接書き換える
$ sed 's/foo/bar/g' input.txt
$ sed -n '5,10p' input.txt # 5〜10行目だけを表示
$ sed -e 's/a/b/' -e 's/c/d/' input.txt
-i はGNU版とBSD版(macOS)で書き方が異なる.BSD版では sed -i '' 's/foo/bar/g' input.txt のようにバックアップ用の拡張子(ここでは空文字)を指定する必要がある.
awk
Aho, Weinberger, Kernighan
テキストを行ごと・フィールドごとに処理するための,小さなプログラミング言語である.名前は開発者であるアルフレッド・エイホ,ピーター・ワインバーガー,ブライアン・カーニハンの頭文字から来ている.各行は空白で区切られ,$1,$2,…で各フィールドを,$0 で行全体を参照できる.
-F 文字(Field separator):フィールドの区切り文字を指定する-v 変数=値(variable):プログラムに渡す変数を設定する-f ファイル(file):プログラムをファイルから読み込む
# 2列目だけを表示する
$ awk '{print $2}' data.txt
# CSV の3列目の合計を求める
$ awk -F ',' '{sum += $3} END {print sum}' data.csv
権限
chmod
change mode
ファイルのパーミッション(アクセス権)を変更する.名前のモード(mode)はパーミッションのことである.パーミッションは「所有者」「グループ」「その他」の3者それぞれに対して,読み取り(read),書き込み(write),実行(execute)の可否を設定するものである.
数値で指定する場合は,r = 4,w = 2,x = 1 として足し合わせた数を3者分並べる.たとえば 755 は所有者が rwx(4 + 2 + 1),グループとその他が r-x(4 + 1)を意味する.
記号で指定する場合は,対象を u(user,所有者),g(group),o(others),a(all)で表し,+(追加),-(削除),=(設定)と組み合わせる.
-R(Recursive):ディレクトリ以下のすべてのファイルに再帰的に適用する.小文字の-rではないので注意する-v(verbose):処理したファイルを1つずつ表示する
$ chmod 755 script.sh
$ chmod +x script.sh # 全員に実行権限を追加
$ chmod u+w,o-r file.txt # 所有者に書き込みを追加,その他から読み取りを削除
$ chmod -R 644 docs/
chown
change owner
ファイルの所有者や所有グループを変更する.ユーザー:グループ の形で両方を同時に指定できる.他のユーザーのファイルを変更するには,通常 sudo による管理者権限が必要である.
-R(Recursive):ディレクトリ以下のすべてのファイルに再帰的に適用する-v(verbose):処理したファイルを1つずつ表示する
$ sudo chown user:staff file.txt
$ sudo chown -R user /var/www/app
sudo
superuser do
指定したコマンドを管理者(root)など別のユーザーの権限で実行する.名前はもともと superuser do の略とされるが,現在では substitute user do(別のユーザーとして実行する)と説明されることも多い.システムの設定変更やソフトウェアのインストールなどで使う.
-u ユーザー(user):root以外の指定したユーザーとして実行する-i:対象ユーザーとしてログインしたのと同じ状態でシェルを起動する(長い形式は--login)-s(shell):現在の環境のままシェルを起動する-l(list):自分がsudoで実行を許可されているコマンドを表示する-k:パスワードの入力を省略できる猶予期間を取り消し,次回は必ずパスワードを求めるようにする(長い形式は--reset-timestamp)
$ sudo apt install git
$ sudo -u postgres psql
プロセスの管理
ps
process status
実行中のプロセスを一覧表示する.ps には,ハイフンを付けないBSD形式と,ハイフンを付けるUNIX(System V)形式の2種類のオプションがあり,よく使われる組み合わせは次の2つである.
ps aux(BSD形式)の各文字の意味は次のとおり.
a(all):自分以外のユーザーのプロセスも表示するu(user-oriented):所有ユーザーやCPU・メモリ使用率を含む形式で表示するx:端末に結びついていないプロセス(デーモンなど)も表示する
ps -ef(UNIX形式)の各文字の意味は次のとおり.
-e(every):すべてのプロセスを表示する-f(full):親プロセスのIDなどを含む詳細な形式で表示する
各行の PID(プロセスID)は,後述の kill でプロセスを指定するときに使う.
$ ps aux | grep node
top
プロセスごとのCPUやメモリの使用状況をリアルタイムで表示する.名前は,資源を多く使っている上位(top)のプロセスを表示することに由来するとされる(要確認).オプションはLinux版(procps)とmacOS版で大きく異なる.以下はLinux版のものである.
-d 秒(delay):画面を更新する間隔を指定する-p PID(pid):指定したプロセスだけを表示する-u ユーザー(user):指定したユーザーのプロセスだけを表示する-b(batch):対話画面ではなく,テキストとして出力する.-n(number of iterations)で回数を指定し,ファイルに保存するときなどに使う
起動後は,P でCPU使用率順,M でメモリ使用率順に並べ替え,q で終了する.macOS版では top -o cpu のように -o(order)で並び順を指定する.
kill
プロセスにシグナルを送る.名前に反して,終了以外のシグナルも送れる.デフォルトでは終了を依頼する SIGTERM(15番)を送る.
-s シグナル(signal):送るシグナルを名前で指定する-番号:送るシグナルを番号で指定する.-9は強制終了のSIGKILL,-1はSIGHUP(hang up,設定の再読み込みによく使われる)-l(list):使えるシグナルの一覧を表示する
SIGKILL はプロセス側で後始末ができないので,まずは通常の kill を試すのがよい.
$ kill 12345
$ kill -9 12345
$ kill -s HUP 12345
ヘルプを見る
man
manual
コマンドのマニュアル(manページ)を表示する.オプションの意味を調べたいときにまず使う.表示には less などのページャが使われるので,操作方法も同じである.
manページはセクションに分かれていて,1がユーザーコマンド,5がファイルの形式,8がシステム管理用コマンドなどとなっている.同じ名前が複数のセクションにある場合は,man 5 passwd のように番号で指定する.
-k キーワード(keyword):キーワードに関連するmanページを検索する(aproposと同じ)-f コマンド:コマンドの1行説明を表示する(whatisと同じ)
$ man grep
$ man -k compress
多くのコマンドは --help を付けて実行すると簡単な使い方を表示する.ただし,macOSに入っているBSD版のコマンドなど,--help に対応していないものもある.
最後に
ぶっちゃけテキスト処理系についてはほとんど知らないやつでした.まあでもエディタ使うしそんなに覚えなくてもいいかな〜.
grepやfindはちゃんと使えるようになりたいですね.活用法はかなりありそう.
ちなみにsedとvimはUnix初期の"ed"ってエディタがルーツらしいです.なんか似てるなと思ったらそういうことか. あとは,lessはvimの操作感を参考にしてるらしいのでこちらもvimっぽいです.エディタとページャで棲み分けしてるんですね〜.