Core utilities
この記事では less, ls, grep などの GNU/Linux システムのコアユーティリティを扱っています。この記事の扱う範囲は GNU coreutils パッケージに含まれているユーティリティに留まりません。ユーティリティに関連する様々なヒント・小技、その他便利な情報を載せています。
目次
基本コマンド
以下の表には ArchLinux ユーザーが知っておくべきいくつかの重要なユーティリティを載せています。intro(1) も参照してください。
パッケージ | ユーティリティ | 説明 | ドキュメント | 代替品 |
---|---|---|---|---|
シェル組み込み | cd | ディレクトリを変更 | cd(1p) | #cd の代替 |
GNU coreutils | ls | ファイルを一覧表示 | ls(1), info | tree, #ls の代替 |
cat | ファイルを連結して表示 | cat(1), info | tac(1), bat | |
mkdir | ディレクトリを作成 | mkdir(1), info | ||
rmdir | 空のディレクトリを削除 | rmdir(1), info | ||
rm | ファイルやディレクトリを削除 | rm(1), info | shred | |
cp | ファイルやディレクトリをコピー | cp(1), info | #cp の代替 | |
mv | ファイルやディレクトリを移動 | mv(1), info | ||
ln | ハードリンクやシンボリックリンクを作成 | ln(1), info | ||
chown | ファイルの所有者やグループを変更 | chown(1), info | chgrp(1) | |
chmod | ファイルのパーミッションを変更 | chmod(1), info | ||
dd | ファイルを変換・コピー | dd(1), info | ||
df | ファイルシステムの使用状況を表示 | df(1), info | ||
GNU tar | tar | tar アーカイバ | tar(1), info | アーカイバ |
GNU less | less | ターミナルページャ | less(1) | ターミナルページャ |
GNU findutils | find | ファイルやディレクトリを検索 | find(1), info, [[1]] | #find の代替 |
GNU diffutils | diff | ファイルを行毎に比較 | diff(1), info | #diff の代替 |
GNU grep | grep | パターンに一致する行を表示 | grep(1), info | #grep の代替 |
GNU sed | sed | ストリームエディタ | sed(1), info, one-liners | |
GNU gawk | awk | パターンスキャンとデータ処理言語 | gawk(1), info | nawk, mawkAUR |
util-linux | dmesg | カーネルリングバッファを出力/制御 | dmesg(1) | systemd/ジャーナル |
lsblk | ブロックデバイスを一覧表示 | lsblk(8) | ||
mount | ファイルシステムをマウント | mount(8) | ||
umount | ファイルシステムをアンマウント | umount(8) | ||
su | ユーザを変更 | su(1) | sudo, opendoas | |
kill | プロセスを終了 | kill(1) | pkill(1), killall(1) | |
procps-ng | pgrep | 名前や属性によってプロセスを検索 | pgrep(1) | pidof(1) |
ps | プロセスの情報を表示 | ps(1) | top(1), htop | |
free | メモリの使用/未使用量を表示 | free(1) |
データの損失を防ぐ
rm
や mv
、cp
、シェルのリダイレクトは問答無用でファイルを削除/上書きします。rm
と mv
、cp
はすべて -i
フラグをサポートしており、このフラグを使うとファイルを削除/上書きする前にユーザに尋ねるようになります。エイリアスを使って -i
フラグをデフォルトで有効化したいユーザもいるでしょう。しかし、これらのシェルオプションに頼りっきりなるのは危険です。これらのオプションに慣れてしまうと、これらを使用していない他のシステムやユーザを使うときにデータ損失を招く可能性があります。データ損失を防ぐ最良の方法はバックアップを取ることです。
その他のコマンド
以下の表にはしばしば便利なコアユーティリティをリストしています。
パッケージ | ユーティリティ | 説明 | ドキュメント | 代替品 |
---|---|---|---|---|
シェル組み込み | alias | エイリアスを定義/表示 | alias(1p) | |
type | コマンドのタイプを表示 | type(1p) | which(1) | |
time | コマンドの所要時間を計測 | time(1p) | ||
GNU coreutils | tee | 標準入力を読み込み、標準出力やファイルに書き出す | tee(1), info | |
mktemp | テンポラリファイルやテンポラリディレクトリを作成 | mktemp(1), info | ||
cut | 行の選択した部分を表示 | cut(1), info | ||
tr | 文字を置換/削除 | tr(1), info | ||
od | ファイルを8進数や他の基数でダンプ | od(1), info | hexdump(1), vim's xxd(1) | |
sort | 行をソート | sort(1), info | ||
uniq | 繰り返される行を表示/省略 | uniq(1), info | ||
comm | 2つのソート済みのファイルを行単位で比較 | comm(1), info | ||
head | ファイルの最初の部分を出力 | head(1), info | ||
tail | ファイルの最後の部分を出力/追従 | tail(1), info | ||
wc | 改行や単語、バイト数を表示 | wc(1), info | ||
GNU binutils | strings | バイナリファイル内の表示可能な文字を表示 | strings(1), info | stringsextAUR |
GNU glibc | iconv | 文字コードを変換 | iconv(1) | recode |
file | file | ファイルタイプを推測 | file(1) |
moreutils パッケージには GNU coreutils に無い sponge(1) のような便利なツールを提供します。
代替コマンド
代替のコアユーティリティは BusyBox、Heirloom Toolchest、9base、 sbase-gitAUR、ubase-gitAUR により提供されています。
cat の代替
- bat — シンタックスハイライトと Git 統合機能を備えた cat クローン
cd の代替
- zoxide — ユーザーの癖を学習するスマートな cd コマンド。たった数個のキーストロークでどこへでも移動できます。
cp の代替
rsync を cp/mv の代わりとして使うことで、失敗したファイル転送の再開、転送状況の表示、すでに存在するファイルのスキップ、チェックサムによる転送先ファイルの整合性の確認が可能になります。
ls の代替
- broot — ディレクトリツリーを表示・移動する新しい方法
- clifm — ls(1) のようにファイルを一覧表示し、さらにアイコン表示と RGB カラーサポートを備えたファイルマネージャ
- exa — カラー表示、ツリー表示、git 統合などの機能を備えたもう一つの ls 代替
- lsd — 多くの美しい色と素晴らしいアイコンを備えたモダンな ls
find の代替
- fd — シンプルで速く、ユーザーフレンドリーな find の代替。隠しファイルや
.gitignore
にあるファイルをデフォルトで無視します。
- fuzzy-find — ファイルを探すときにあいまいな補完ができます。
- mlocate — locate/updatedb の実装をマージ。
- plocate — よりさらに速い locate
グラフィカルなファイル検索ソフトウェアは アプリケーション一覧/ユーティリティ#File searching をご覧ください。
diff の代替
diffutils では単語単位の差分表示ができませんが、それが可能なプログラムがいくつか存在します:
- git の diff は
--color-words
フラグを使用すると単語単位の差分表示が可能です。--no-index
フラグを使用すれば Git のワークツリー外でも使用可能です。 - cwdiff — 出力をカラー表示化する GNU wdiff ラッパー
- git-delta — git や diff 、grep 用の出力をシンタックスハイライトするページャー
- dwdiff — 単語単位で差分表示する diff のフロントエンド。カラー表示サポート付き。
- icdiff — Python で書かれたカラー表示 diff ツール。"Improved color diff" は通常の diff の使用を補助するという意味です。
- wdiff — GNU diff の単語単位の実装。カラー表示はサポートしません。
アプリケーション一覧/ユーティリティ#Comparison, diff, merge もご覧ください。
grep の代替
- mgrep — 複数行 grep
- pdfgrep — PDF ファイル内のテキストを検索するツール
- ripgrep-all — プレーンテキストのみならず、PDF ファイルや E-Books、Office ドキュメント、zip、tar.gz ファイル内のテキストも検索できます。
コード検索ソフトウェア
以下の3つのツールはコード検索の場面で grep を置き換えることを目的としています。これらはデフォルトで再帰検索をし、バイナリファイルや .gitignore
内にあるファイルをスキップします。
- ack — Perl ベースの grep 置き換え。多種多様なソースコードの大きなツリーを扱うプログラマに向けです。
- ripgrep (rg) — ag の使いやすさと grep のそのままの速さを組み合わせた検索ツール。
- The Silver Searcher (ag) — Ack に似ているがより速いコード検索ツール。
インタラクティブフィルター
- fzf — 汎用のコマンドラインあいまい検索ソフトウェア。デフォルトで find を使用します。
- fzy — 高度なスコアリングアルゴリズムを搭載した速くてシンプルなあいまいテキストセレクタ。
- peco — シンプルなインタラクティブフィルタリングツール。
- percol — UNIX シェルの伝統的なパイプにインタラクティブフィルタリングを追加。
- skim — Rust で書かれたあいまい検索ソフトウェア。fzf に似ています。
使い方
cat
cat (catenate) はファイルを連結して表示する標準の Unix ユーティリティです。
- cat はシェルにビルトインされていないため、多くの場合でリダイレクションを使ったほうが便利です (例: スクリプト、もしくはパフォーマンスが必要な場合)。実際
< file
はcat file
と全く同じです。
- cat は複数行でも動作します:
$ cat << EOF >> path/file first line ... last line EOF
代わりに printf
コマンドを使用:
$ printf '%s\n' 'first line' ... 'last line'
- ファイルの行を逆順で cat する必要がある場合、tac (cat reversed) という名前のユーティリティがあります。
chmod
ファイルのパーミッションと属性#パーミッションを変更を見てください。
chown
ファイルのパーミッションと属性#所有者を変更を見てください。
dd
dd は主にファイルを変換・コピーするために使われる Unix や Unix ライクなオペレーティングシステムのコマンドです。
cp はいくつかのオペランドを除いて dd と同じですが、多目的のディスク消去作業向きには作られてはいません。
'dd' は以下のような作業ができます:
- ドライブ関連の作業:
- イメージの作成。
- イメージの書き込み。
- ドライブやパーティションの複製。
- ドライブやパーティションの消去。
- パーティションテーブルやブートセクタの消去。
- ブートセクタのバックアップ。
- システムの復元。
- デバイスや
dd /dev/random
、あるいは入力デバイスからストリームを取得 - CPU に負担をかける (例:
dd if=/dev/zero of=/dev/null
). - ディスクに負担をかける (例:
dd if=/dev/zero of=/path/testfile bs=number_ofG count=times oflag=fdatasync
) - バックアップユーティリティとして使用
- ファイルを大文字・小文字に変換
dd 派生
他の dd ライクなプログラムには定期的に状態を出力する (例: シンプルなプログレスバー) 機能があります。
- dcfldd
- dcflddAUR は dd にフォレンジクスやセキュリティの面で改良を加えたバージョンです。ほとんどの dd のパラメータを扱うことができステータスの出力もできます。dcfldd の最後の安定版は2006年12月19日にリリースされました。[2]
find
find は findutils パッケージに含まれており、base パッケージグループのひとつとしてインストールされます。
find コマンドはファイル名を引数としてファイルシステムの中に名前が一致するファイルがないか検索するコマンドではありません。下の #locate を見てください。
find はディレクトリのセットとマッチするファイルの正規表現を引数として取ります。非常に強力なワンライナーを作ることができますが、直感的な検索コマンドとしては使えません。詳しい使用方法は UsingFind を見てください。
grep
grep (ed の g/re/p, global/regular expression/print から) は Unix のために書かれたコマンドラインの文章検索ユーティリティです。grep コマンドはファイルや標準入力から与えられた正規表現と一致する行を検索し、プログラムの標準出力に表示します。
- grep はファイルを処理できるので、
cat file | grep pattern
のようなコンストラクトはgrep pattern file
に置き換えられます - VCS のソースコードを grep する場合、ripgrep や ack、the_silver_searcher などの最適化されたユーティリティが存在します。
-n
オプションを使うことで出力にファイルの行番号が含まれているようになります。
カラー出力についてはコンソールのカラー出力#grep を見てください。
iconv
iconv
は文字列のエンコーディングをあるコードセットから他のコードセットへ変換します。
次のコマンドはファイル foo
を ISO-8859-15 から UTF-8 へ変換して foo.utf
として保存します:
$ iconv -f ISO-8859-15 -t UTF-8 foo >foo.utf
詳しくは iconv(1) を読んで下さい。
ファイルを変換する
sed とは異なり、iconv にはファイルを変換するオプションはありません。しかしながら、(moreutils に含まれている) sponge
を使うことでファイルを変換することもできます:
$ iconv -f WINDOWS-1251 -t UTF-8 foobar.txt | sponge foobar.txt
詳しくは sponge(1) を参照。
ip
ip を使うことで Linux の IP ソフトウェアスタックにおけるネットワークデバイス・IP アドレス・ルーティングテーブルなどの情報を表示することができます。様々なコマンドを加えることで、オブジェクトの操作や設定をすることも可能です。
オブジェクト | 用途 | man ページ |
---|---|---|
ip addr | プロトコルアドレス管理 | ip-address(8) |
ip addrlabel | プロトコルアドレスラベル管理 | ip-addrlabel(8) |
ip l2tp | tunnel ethernet over IP (L2TPv3) | ip-l2tp(8) |
ip link | ネットワークデバイス設定 | ip-link(8) |
ip maddr | マルチキャストアドレス管理 | ip-maddress(8) |
ip monitor | netlink メッセージの監視 | ip-monitor(8) |
ip mroute | マルチキャストルーティングキャッシュ管理 | ip-mroute(8) |
ip mrule | マルチキャストルーティングポリシー db のルール | |
ip neigh | neighbour/arp テーブル管理 | ip-neighbour(8) |
ip netns | プロセスネットワーク名前空間管理 | ip-netns(8) |
ip ntable | neighbour テーブル設定 | ip-ntable(8) |
ip route | ルーティングテーブル管理 | ip-route(8) |
ip rule | ルーティングポリシーデータベース管理 | ip-rule(8) |
ip tcp_metrics | TCP Metrics の管理 | ip-tcp_metrics(8) |
ip tunnel | トンネル設定 | ip-tunnel(8) |
ip tuntap | TUN/TAP デバイスの管理 | |
ip xfrm | IPsec ポリシーの管理 | ip-xfrm(8) |
全てのオブジェクトで help
コマンドが利用可能です。例えば、ip addr help
と入力すればアドレスオブジェクトで利用できるコマンド構文が表示されます。高度な利用方法は iproute2 documentation を見て下さい。
ネットワーク設定の記事では実際問題として ip コマンドを様々な作業でどうやって使えばいいのか解説しています。
less
less はテキストファイルの中身を一画面単位で表示するのに使われるターミナルページャプログラムです。more や pg といった他のページャと同じですが、less はより高度なインターフェイスと完全な feature-set を提供します。
less の代替プログラムについてはアプリケーション一覧#ターミナルページャを見て下さい。
locate
mlocate パッケージをインストールしてください。インストール後、自動的にデータベースを更新するスクリプトが毎日実行されるようになります。手動で root で updatedb を実行することでいつでもデータベースは更新できます。デフォルトでは /media
や /mnt
などのパスは無視されるので locate は外部デバイスのファイルを検索できません。詳しくは updatedb(8) を見てください。
locate コマンドはファイルを名前で検索する一般的な Unix ツールです。あらかじめ作成しておいたデータベースファイルを使って検索するためファイルシステムを直接検索する find ツールよりも高速に検索できます。欠点としてデータベースが作成された後に作られたファイルは locate で検索できません。データベースを更新する updatedb コマンドを定期的に実行することで問題は抑えられます。
locate は使う前にデータベースの作成が必要です。root で updatedb
を実行してください。
How locate works and rewrite it in one minute も参照。
もうひとつのページャとしての Vim
Vim (visual editor improved) にはテキストファイル・圧縮ファイル・バイナリ・ディレクトリの中身を表示するスクリプトが含まれています。次の行をシェルの設定ファイルに追加することでページャとして使うことが可能です:
~/.bashrc
alias less='/usr/share/vim/vim80/macros/less.sh'
また、less.sh マクロの代替も存在し、PAGER
環境変数として使えます。vimpager をインストールしてシェルの設定ファイルに以下を加えて下さい:
~/.bashrc
export PAGER='vimpager' alias less=$PAGER
これで PAGER
環境変数を使うプログラム、git などはページャとして vim を使うようになります。
ls
ls (list) は Unix や Unix ライクなオペレーティングシステムで使われる、ファイルを一覧するコマンドです。
詳しい情報は info ls
や オンラインマニュアル を見てください。
exa は近代的でユーザーフレンドリーな ls
と tree
の代替ユーティリティです。ファイル名と一緒に Git の変更を表示したり、--long
モードで各カラムをカラー化したり、--long
モードで tree
ビューとメタデータを同時に表示する機能があります。
長い出力
-l
オプションはメタデータを表示します。例:
$ ls -l /path/to/directory
total 128 drwxr-xr-x 2 archie users 4096 Jul 5 21:03 Desktop drwxr-xr-x 6 archie users 4096 Jul 5 17:37 Documents drwxr-xr-x 2 archie users 4096 Jul 5 13:45 Downloads -rw-rw-r-- 1 archie users 5120 Jun 27 08:28 customers.ods -rw-r--r-- 1 archie users 3339 Jun 27 08:28 todo -rwxr-xr-x 1 archie users 2048 Jul 6 12:56 myscript.sh
total
の値はディレクトリ内のファイルに割り当てられたディスクのブロック数を表します。
ファイルやサブディレクトリの行は7つのメタデータフィールドに分けられます:
- タイプとパーミッション:
- 最初の文字はタイプです。タイプの説明は
info ls -n "What information is listed"
を見てください。例:-
は通常のファイルです。d
はディレクトリです。p
は名前付きパイプ (別名 FIFO) です。l
はシンボリックリンクです。
- 他の文字はパーミッションです。
- 最初の文字はタイプです。タイプの説明は
- ハードリンクの数。ファイルは最低でも1になります。フォルダは最低でも2になります。
- 所有者のユーザーの名前。
- グループの名前。
- サイズ。
- 最後に更新されたタイムスタンプ。
- エンティティ名。
空白を含むファイル名がクォートで囲まれる
デフォルトで、空白を含むファイル名やディレクトリ名はシングルクォートで囲まれて表示されます。-N
や --quoting-style=literal
オプションを使うことでクォートを消せます。また、QUOTING_STYLE
環境変数を literal
に設定することでも同じ効果があります [3]。
lsblk
lsblk(8) は利用可能なブロックデバイスとパーティションスキームを表示します。例:
$ lsblk -f
NAME FSTYPE LABEL UUID MOUNTPOINT sda ├─sda1 vfat C4DA-2C4D /boot ├─sda2 swap 5b1564b2-2e2c-452c-bcfa-d1f572ae99f2 [SWAP] └─sda3 ext4 56adc99b-a61e-46af-aab7-a6d07e504652 /
デバイスの名前はブロックデバイスのタイプを表します。近代的なストレージデバイス (例: ハードディスク, SSD, USB フラッシュドライブ) は大抵 SCSI ディスク (sd
) と認識されます。タイプの後に付いている小文字は a
なら1番目のデバイス (sda
)、b
なら2番目のデバイス (sdb
) を示します。デバイス内に存在するパーティションも同じように1番目のパーティション (sda1
), 2番目のパーティション (sda2
) と 1
からの数字が付きます。上記の例の場合、利用できるデバイスはひとつだけ (sda
) で、デバイスには3つのパーティション (sda1
から sda3
) が存在し、それぞれ異なるファイルシステムが使われていることが確認できます。
他によく使われるブロックデバイスのタイプとしてはメモリカードの mmcblk
や NVMe デバイスの nvme
などがあります。知らないタイプは カーネルドキュメント で検索してください。
mkdir
mkdir (make directory) はディレクトリを作成するコマンドです。
- ディレクトリと階層全体を作るには、
-p
スイッチを使って下さい。そうしないとエラーが表示されます。-p
スイッチをデフォルトで使うようにすることもできます:
alias mkdir='mkdir -p -v'
-v
スイッチはメッセージを有効にします。
- 作成したディレクトリのモードを変更するのに chmod を使う必要はありません。
-m
オプションでアクセス権限を定義できます。
mv
mv (move) はファイルやディレクトリを移動したり名前の変更をするコマンドです。
- 危険なコマンドになる可能性があるので範囲に制限をかけたほうが賢明です:
alias mv=' timeout 8 mv -iv'
- このエイリアスは8秒後に mv を中止し、3つ以上のファイルの削除を確認し、進行中の操作を表示し、(スペースから始まるコマンドを無視するようシェルが設定されている場合) シェルの history ファイルに操作を保存しません。
od
od (octal dump) コマンドは人間が読める形式になっていないデータ (プログラムの実行形式のコードやフォーマットされていないデバイスの中身など) を可視化するのに役立ちます。詳しくは マニュアル を参照してください。
pv
pv (pipe viewer) を使うことでデータ操作の進捗をパイプラインで監視できます。例:
# dd if=/source/filestream | pv -monitor_options -s size_of_file | dd of=/destination/filestream
大抵の場合 pv
は cat
の代替として機能します。
rm
rm (remove) はファイルやディレクトリを削除するコマンドです。
- 使い方によっては危険性があるので範囲に制限をかけると良いでしょう:
alias rm=' timeout 3 rm -Iv --one-file-system'
- このエイリアスは3秒後に rm を中止し、3つ以上のファイルの削除を確認し、進行中の操作を表示し、複数のファイルシステムに影響を与えず、(スペースから始まるコマンドを無視するようシェルが設定されている場合) シェルの history ファイルに操作を保存しません。たった1つのファイルでも確認が必要ならば
-I
の代わりに-i
を使って下さい。 - Zsh のユーザーは
timeout
の前にnoglob
を記述することで暗示的な拡張を避けることができます。
- 空のディレクトリを削除するときは、rmdir を使ってください。
sed
sed (stream editor) は文章をパース・変換する Unix ユーティリティです。
ここに sed を使ったワンライナーのリストがあります。
seq
seq (sequence) は連続する数字を生成するユーティリティです。シェルに内蔵されている代替があるので、Wikipedia で説明されているように使うと良いでしょう。
ss
ss はネットワークポートを確認するユーティリティです。iproute2 パッケージに含まれており base グループのひとつとしてインストールされます。非推奨 となった netstat ユーティリティと同じような機能を持っています。
一般的な使用方法:
全ての TCP ソケットとサービス名を表示:
$ ss -at
全ての TCP ソケットとポート番号を表示:
$ ss -atn
全ての UDP ソケットを表示:
$ ss -au
詳しくは ss(8) や iproute2 パッケージの ss.html
を見てください。
tar
初期の Unix の圧縮形式として、tar
ファイル (別名 tarball) は Unix ライクなオペレーティングシステムでパッケージの作成に広く使われています。pacman と AUR のパッケージはどちらも tarball であり、Arch はデフォルトで GNU の Tar
プログラムを使います。
tar
アーカイブを扱うとき、tar
はデフォルトで拡張子にあわせてファイルを展開します:
$ tar xvf file.EXTENSION
特定の形式を指定する場合:
ファイルタイプ | 解凍コマンド |
---|---|
file.tar |
tar xvf file.tar
|
file.tgz |
tar xvzf file.tgz
|
file.tar.gz |
tar xvzf file.tar.gz
|
file.tar.bz |
bzip -cd file.bz | tar xvf -
|
file.tar.bz2 |
tar xvjf file.tar.bz2 bzip2 -cd file.bz2 | tar xvf -
|
file.tar.xz |
tar xvJf file.tar.xz xz -cd file.xz | tar xvf -
|
file.tar.zst |
tar -I zstd xvf file.tar.zst
|
上記の tar
引数の中にはレガシーなものもありますが、特定の操作をするときは未だに有用です。詳しい説明は tar(1) の man ページの Compatibility セクションを見て下さい。
which
which コマンドは実行可能ファイルのパスを確認したいときに便利です。例:
# journalctl $(which sshd)
wipefs
wipefs は指定したデバイスのファイルシステム, RAID, パーティションテーブルのシグネチャ (マジック文字列) を確認・消去することができます。ファイルシステム自体は消去せず、デバイスの他のデータが消去されることもありません。
詳しくは wipefs(8) を参照してください。
例えば、/dev/sdb
デバイスのシグネチャを全て消去してシグネチャのバックアップファイル ~/wipefs-sdb-offset.bak
を作成するには:
# wipefs --all --backup /dev/sdb
参照
- A sampling of coreutils , part 2 , part 3 - coreutils のコマンドの概要
- GNU Coreutils オンラインドキュメント
- Learn the DD command
- POSIX utilities