- -P
- シンボリックリンクを解決した物理パスを表示
- -L
- シンボリックリンクを残した論理パスを表示(デフォルト)
pwd今どこにいる?
pwd -Pシンボリックリンク経由で移動してきたときの実際のパス
ファイルと権限からネットワーク、systemd、テキスト処理まで、用途別の Linux コマンド。すべての項目にオプション、コピーできる例、macOS での注意点付き。
最終確認日:2026-10-18、GNU coreutils 9.x、util-linux、procps-ng、iproute2、systemd、bash 5.2 の各マニュアル。macOS の注記は macOS 26 の man ページと照合 で確認。
ファイルを読み、ログをページ単位で確認し、ターミナルで編集し、バージョンを比較します。
cat /etc/os-releaseファイルを表示
cat part1.txt part2.txt > whole.txt連結
cat -A script.sh | head隠れたタブや Windows の ^M 改行を見つける
macOS/BSD: macOS の cat には -A がありません。同じ表示には cat -vet を使います。
tac access.log | head新しいログ行から表示
macOS/BSD: macOS にはありません。tail -r file を使います。
less /var/log/syslogログを読む
journalctl -u nginx | less -S長い行を折り返さずに表示
head -n 20 data.csvヘッダーと最初の数行
head -c 512 file.bin | xxdバイナリの先頭をのぞく
macOS/BSD: macOS の head は負の数を受け付けません。
tail -n 50 app.log最後の 50 行
tail -F /var/log/nginx/access.logローテーションされるログを監視
tail -n +2 data.csvCSV のヘッダー行を飛ばす
sudo nano /etc/hostsシステムファイルを編集
画面下部のショートカットバーにキーが表示されます。^ は Ctrl、M- は Alt を意味します。
vim +42 app.py42 行目を開く
diff -u old.conf new.conf読みやすい差分表示
diff -rq dir1/ dir2/2 つのツリーで異なるファイル
diff <(sort a.txt) <(sort b.txt)プロセス置換でソートしてから比較
make 2>&1 | tee build.logビルドを見ながらログを残す
echo 'vm.swappiness=10' | sudo tee -a /etc/sysctl.confroot 所有のファイルに追記(リダイレクトはシェルが行うため sudo echo >> は失敗する)
printf '%s\n' "$var"-n で始まる場合でも変数を安全に出力
printf '%-12s %6.2f\n' disk 93.5列をそろえて出力
echo -e や echo -n はシェルによって動作が異なります。printf はどこでも同じように動作します。
column -t -s, data.csv | less -S単純な CSV を表として読む
mount | column -t空白区切りの出力を整列
xxd image.png | head16 進数と ASCII を並べて表示
hexdump -C file.bin | head標準形式の 16 進ダンプ
xxd は vim のパッケージに含まれています。hexdump は util-linux に含まれます(新しい Debian/Ubuntu では bsdextrautils)。
strings -n 8 firmware.bin | lessバージョン文字列、URL、パスを探す
Linux では binutils に含まれています。
ファイルを読み取り・書き込み・実行できるユーザーを確認し、変更します。
ls -l deploy.sh-rwxr-x--- 1 alice devs 812 Oct 18 09:12 deploy.sh
1 文字目は種類です(- はファイル、d はディレクトリ、l はシンボリックリンク)。その後に所有者、グループ、その他のユーザーの 3 文字ずつが続きます。r=4、w=2、x=1 なので、rwxr-x--- は 750 です。
chmod 644 index.html所有者は読み書き、全員が読み取り可:通常のファイル
chmod 755 deploy.sh所有者はすべて、他は読み取り・実行:スクリプトとディレクトリ
chmod 600 ~/.ssh/id_ed25519秘密鍵を自分だけが読めるようにする。権限が緩い鍵は ssh が拒否する
chmod +x script.shスクリプトを実行可能にする
chmod go-w fileグループとその他から書き込み権限を外す
chmod -R u=rwX,go=rX site/大文字の X は、ディレクトリと既に実行権限のあるファイルにだけ実行権限を付ける
find site/ -type d -exec chmod 755 {} +正しい解決策その 1: ディレクトリは 755
find site/ -type f -exec chmod 644 {} +その 2: ファイルは 644
危険: マシン上のすべてのユーザーと、乗っ取られたすべてのサービスにツリー全体への書き込み権限を与え、全ファイルを実行可能にし、~/.ssh が 777 だと OpenSSH が鍵を拒否するようになります。/etc や /usr に適用すると sudo やシステムが壊れることがあります。代わりに chown で所有者を直すか、2 つの find コマンドを使ってください。
sudo chown -R www-data:www-data /var/www/siteWeb ルートを Web サーバーのユーザーに渡す
sudo chown "$USER": file.txtroot が作成したファイルの所有者を自分にする
危険: /、/usr、/etc に sudo chown -R を実行すると、sudo、passwd、各種サービスが依存している setuid ビットと所有者情報が失われ、復旧にはたいてい再インストールが必要になります。パスをよく確認してください。
chgrp -R developers /srv/shared共有フォルダーをチームのグループに渡す
umask現在のマスクを表示(通常は 0022)
umask 077このシェルでは新しいファイルを 600、ディレクトリを 700 にする
マスクはビットを取り除きます。ファイルは 666、ディレクトリは 777 から始まるので、022 ならそれぞれ 644 と 755 になります。
sudo systemctl restart nginx管理コマンドを 1 つ実行
sudo !!直前のコマンドを sudo 付きで再実行
sudo -u postgres psqlサービス用ユーザーとして実行
su - deploydeploy ユーザーの環境でログイン
sudo su -root にパスワードがないときの root シェル(sudo -i でも同じ)
setfacl -m u:alice:rw report.xlsxグループを変えずに alice に読み書きを許可
getfacl report.xlsxすべてのエントリーを表示
setfacl -R -m g:devs:rwX /srv/appグループにツリー全体へのアクセス権を与える
ls -l のパーミッション文字列の末尾にある + は、そのファイルに ACL が設定されていることを示します。
sudo chattr +i /etc/resolv.conf-i で解除するまで、root を含め誰も変更・削除できない
lsattr /etc/resolv.conf属性を表示。i は変更不可を表す
ext4、XFS、Btrfs で使えます。root でも「Operation not permitted」と表示される場合は lsattr で確認してください。
実行中のものを見つけて停止し、処理をバックグラウンドで実行します。
ps aux | grep [n]ginx[n] の書き方で grep 自身を結果から除外
ps aux --sort=-%mem | headメモリ使用量の多いプロセス
ps -o pid,ppid,etime,cmd -p 1234プロセスの実行時間
macOS/BSD: macOS の ps には --sort がありません。ps aux -m(メモリ順)か ps aux -r(CPU 順)を使います。
pstree -pPID 付き
pstree -p 1234プロセスが生成した子プロセス
top -b -n 1 | head -20チケットに貼り付けられるスナップショット
macOS/BSD: macOS の top は別のプログラムです。並べ替えは top -o cpu または top -o mem で行います。
htop -u www-data1 人のユーザーのプロセスだけ
apt install htop / dnf install htop でインストールします。
pgrep -a nginxPID とコマンドライン
pgrep -f 'python manage.py runserver'引数でスクリプトを特定
macOS/BSD: macOS では -a は「祖先プロセスを含める」の意味です。名前と引数を見るには pgrep -lf を使います。
pkill -f "node server.js"Node アプリを 1 つ停止
pkill -HUP nginx再読み込みのシグナルを送る
pgrep -af node停止する前に -f で一致するものを確認
パターンは正規表現で、名前のどこに一致しても対象になります。pkill node は nodejs-helper にも当たります。先に pgrep で確認してください。
kill 1234穏やかに停止
kill -9 1234TERM が無視されたときの最終手段
kill %1このシェルのジョブ 1 を終了
まずは通常の kill を試し、数秒待ってください。-9 は後片付けを省くため、一時ファイルやロック、書きかけのデータが残ることがあります。
killall firefoxFirefox のプロセスをすべて
Linux では psmisc パッケージに含まれています。
jobsこのシェルのジョブを番号付きで一覧表示
bg %1ジョブ 1 をバックグラウンドで再開
fg %1フォアグラウンドに戻す
Ctrl+Z でフォアグラウンドのプログラムが一時停止します(bg か fg を実行するまで止まったままです)。
./long-export.sh > export.log 2>&1 &開始してすぐにプロンプトに戻る
waitスクリプト内でバックグラウンドジョブの終了を待つ
nohup ./server > server.log 2>&1 &SSH セッションを閉じても動き続ける
長時間動かすものには、systemd サービス(「サービスとログ」を参照)や tmux のほうが確実です。
disown -h %1nohup を付け忘れたとき:bg でバックグラウンドにしてから disown する
tmux new -s deploy名前付きセッションを開始
tmux attach -t deploySSH が切れた後に再接続
パッケージマネージャーでインストールします。古くからある代替は GNU screen です(Ctrl+A d でデタッチ、screen -r で再接続)。
nice -n 19 tar -czf backup.tgz /dataほかの処理を邪魔しないバックアップ
sudo renice -n -5 -p 1234実行中のプロセスの優先度を上げる
nice 値は -20(最高優先度)から 19(最低優先度)までです。0 未満にできるのは root だけです。
timeout 30s curl -s https://example.com/health30 秒で打ち切る
timeout -s KILL 5m ./job.sh5 分後に強制終了
制限時間に達した場合は終了ステータス 124 で終了します。
watch -n 2 df -hディスク容量が埋まっていく様子を監視
watch -d 'ss -s'-d で変化した部分を強調表示
sudo lsof -i :8080ポート 8080 で待ち受けているもの
sudo lsof +L1削除済みなのに開かれたままのファイル(ディスクが満杯なのに du では何も見つからない場合)
lsof -p 12341 つのプロセスが開いているすべてのファイル
sudo fuser -vm /mnt/usbumount で「target is busy」と表示される原因
sudo fuser -v 8080/tcpTCP ポートを使っているプロセス
危険: fuser -k は対象を使っているすべてのプロセスを確認なしで終了します。マウントポイントに対して実行すると、自分のシェルも含まれることがあります。
time ./build.shreal は経過時間、user + sys は CPU 時間
strace -f -e trace=openat ./app 2>&1 | grep -v ENOENT実際に開いているファイルはどれ?
sudo strace -p 1234応答しないプロセスは何で止まっている?
OS のバージョン、カーネル、CPU、メモリ、ハードウェア、時刻、負荷。
uname -r例:6.8.0-45-generic
uname -mダウンロードすべきバイナリは x86_64 か aarch64 か
cat /etc/os-releasesystemd 以降のすべてのディストリビューションで NAME、VERSION_ID、ID を表示
lsb_release -aDebian/Ubuntu での代替(インストールされていれば)
macOS/BSD: macOS: sw_vers。
hostnamectlホスト名、OS、カーネル、仮想化
sudo hostnamectl set-hostname web01マシン名を変更
uptime1 分、5 分、15 分間のロードアベレージ
負荷は実行中または待機中のプロセス数です。CPU 数(nproc)と比べてください。4 コアで負荷 4 ならフル稼働です。
free -h「free」ではなく「available」列を見る
macOS/BSD: macOS: vm_stat、または top -l 1 | grep PhysMem。
Linux は余った RAM をディスクキャッシュに使うため、正常なマシンでも「free」は少なく見えます。プログラムがまだ使えるのは「available」の値です。
lscpuモデル、ソケット、コア、スレッド、フラグ
make -j"$(nproc)"使えるコアをすべて使う
macOS/BSD: macOS: sysctl -n hw.ncpu と sysctl -n machdep.cpu.brand_string。
lspci -k | grep -A3 -i vgaグラフィックカードと使用中のドライバー
lsusbUSB デバイスがそもそも認識されているか
sudo dmidecode -t memory | grep -i sizeスロットごとの搭載メモリ
sudo lshw -shortデバイスごとに 1 行
sudo dmesg -T | tail -30直前に起きたこと(USB の接続、ディスクエラー)
sudo dmesg -T | grep -i 'out of memory'OOM killer がアプリを止めた?
grep MemAvailable /proc/meminfo利用可能なメモリ(kB)
grep -c ^processor /proc/cpuinfo論理 CPU 数
cat /proc/1234/status1 つのプロセスの状態とメモリ
vmstat 1 5r = 実行キュー、si/so = スワップ、wa = I/O 待ち
iostat -xz 1ディスクごとの使用率(%util)とレイテンシ(await)
iostat は sysstat パッケージに含まれています。
date '+%Y-%m-%d %H:%M:%S'ログ用のタイムスタンプ
date +%s1970-01-01 UTC からの秒数
date -d @1700000000タイムスタンプを日付に変換(GNU)
date -d '2 days ago' +%F相対的な日付(GNU)
macOS/BSD: macOS の date には -d がありません。タイムスタンプには date -r 1700000000、「2 日前」には date -v-2d、解析には date -j -f '%Y-%m-%d' 2026-10-18 +%s を使います。
timedatectl現地時刻、UTC、タイムゾーン、NTP で同期済みか
timedatectl list-timezones | grep Americaタイムゾーン名を探す
sudo timedatectl set-timezone America/Torontoタイムゾーンを変更
空き容量、容量を使っているもの、パーティション、マウント、フォーマット。
df -hマウントされているすべてのファイルシステム
df -h .このディレクトリがあるファイルシステム
df -i空きがあるのに「No space left」? inode が足りないのかもしれません
macOS/BSD: macOS では、-T は種類を表示するのではなく種類で絞り込みます。
du -sh /var/log1 つのフォルダーのサイズ
du -h -d 1 | sort -hサブフォルダー一覧、最大のものが最後(GNU と macOS の両方で動作)
sudo du -xh -d 1 / | sort -h | tail最上位で特に大きいディレクトリ
macOS/BSD: macOS の du には -d はありますが、--max-depth はありません。
sudo ncdu -x /矢印キーで移動、d で削除
apt install ncdu / dnf install ncdu でインストールします。
lsblkディスク、パーティション、サイズ、マウントポイント
lsblk -fどのパーティションが ext4/xfs か、その UUID
macOS/BSD: macOS: diskutil list。
sudo blkid /dev/sdb1/etc/fstab 用の UUID と TYPE
findmntオプション付きのマウントツリー
findmnt -T /var/lib/dockerこのパスがどのファイルシステムにあるか
sudo findmnt --verify再起動前に /etc/fstab のエラーをチェック
sudo mount /dev/sdb1 /mnt/usbUSB メモリをマウント(ディレクトリが存在している必要あり)
sudo mount -o remount,rw /読み取り専用のルートを書き込み可能にする
sudo mount -t nfs nas:/export /mnt/nasNFS 共有をマウント
sudo umount /mnt/usbこれで安全に取り外せる
sudo umount -l /mnt/nas遅延アンマウント:すぐに切り離し、使用されなくなったら後片付け
「target is busy」は、何らかのプロセス(多くはそのディレクトリにいる自分のシェル)が使用中であることを意味します。fuser -vm か lsof で特定してください。
UUID=3f6c... /data ext4 defaults,nofail 0 2ファイルシステムごとに 1 行。nofail ならディスクがなくても起動を続行
sudo mount -afstab の内容を今すぐすべてマウント:再起動前のテストに
fstab にタイプミスがあると、次回の起動が緊急モードになることがあります。編集後は必ず sudo mount -a(または findmnt --verify)を実行してください。
sudo fdisk -lすべてのディスクとそのパーティション
sudo parted /dev/sdb printパーティションテーブルの種類(gpt/msdos)と構成
危険: パーティションテーブルを書き込むと(fdisk の w、parted の mklabel)、そのディスク上の既存データにアクセスできなくなります。先に lsblk でデバイス名を確認してください。/dev/sda と /dev/sdb は簡単に入れ替わります。
sudo mkfs.ext4 -L data /dev/sdb1ラベル付きで ext4 にフォーマット
sudo mkfs.vfat -F 32 /dev/sdc1ほかの機器でも読める FAT32 の USB メモリ
危険: 対象のファイルシステムを即座に消去します。デバイスがマウントされていなければ確認もありません。lsblk -f でデバイスを確認してください。/dev/sda1 ではなく /dev/sda をフォーマットしたり、別のディスクを選んだりすると、そのディスクが失われます。
sudo fsck -f /dev/sdb1アンマウントしたパーティションを強制的に完全チェック
危険: 読み書き可能でマウントされているファイルシステムには絶対に fsck を実行しないでください。破損するおそれがあります。先にアンマウントするか、ルートファイルシステムの場合はレスキューメディアから起動してください。
sudo dd if=ubuntu.iso of=/dev/sdX bs=4M status=progress conv=fsync起動用 USB を作成(sdX はパーティションではなくディスク全体に置き換える)
dd if=/dev/zero of=test.img bs=1M count=100100 MB のファイルを作成
危険: dd は確認なしで of= の対象を上書きします。if= と of= を取り違えたり、間違った /dev/sdX を選んだりすると、そのディスクが消去されます。実行する直前に lsblk で確認してください。
macOS/BSD: macOS: diskutil unmountDisk の後に /dev/rdiskN(diskutil list で確認)を対象にし、bs=4m を使います。進捗は Ctrl+T で表示できます。
sync && sudo umount /mnt/usbUSB ドライブを抜く前に
swapon --show現在のスワップ
sudo fallocate -l 2G /swapfile && sudo chmod 600 /swapfile && sudo mkswap /swapfile && sudo swapon /swapfile2 GB のスワップファイルを追加(維持するには /etc/fstab に追記)
Btrfs でスワップファイルを使うには追加の手順が必要です(最近の btrfs-progs では btrfs filesystem mkswapfile)。
shred -u -n 3 secrets.txt3 回上書きしてから削除
危険: 元に戻せません。また、SSD、ジャーナリングやコピーオンライトのファイルシステム(Btrfs、ZFS)、スナップショットのある環境では確実ではありません。本当に保護したいならディスク全体の暗号化を使ってください。
IP アドレス、ルート、開いているポート、HTTP リクエスト、DNS、SSH、ファイル転送。
ip -br aインターフェースごとに 1 行:名前、状態、アドレス
ip a show eth01 つのインターフェースの詳細
hostname -IIP アドレスだけ
macOS/BSD: macOS: ifconfig、または ipconfig getifaddr en0。
ip は旧来の ifconfig(net-tools)に代わるコマンドです。ifconfig は多くのディストリビューションで標準ではインストールされなくなりました。
ip rルート一覧。「default via」がゲートウェイ
ip route get 1.1.1.1宛先に使われるインターフェースとゲートウェイ
sudo ip route add 10.20.0.0/16 via 192.168.1.1ルートを追加(再起動で消える)
ip linkインターフェースと MAC アドレス
sudo ip link set eth0 down && sudo ip link set eth0 upインターフェースを再起動
危険: SSH 接続に使っているインターフェースを無効にすると、セッションが切断されます。
sudo ss -tulpnすべての待ち受けポートとそのプログラム
ss -tn state established '( dport = :443 )'ポート 443 への確立済みの接続
ss -s接続数の合計
macOS/BSD: macOS: lsof -iTCP -sTCP:LISTEN -n -P、または netstat -an。
ss は netstat に代わるコマンドです。net-tools がインストールされていれば netstat -tulpn も使えます。
curl -I https://example.comステータス行とヘッダー
curl -LO https://example.com/file.tar.gzリダイレクトをたどってダウンロード
curl -s -o /dev/null -w '%{http_code}\n' https://example.comステータスコードだけ
curl -fsSL https://example.com/install.sh -o install.sh実行前に読めるようスクリプトをダウンロード
curl -H 'Content-Type: application/json' -d '{"name":"Ada"}' https://api.example.com/usersJSON を POST
curl -H "Authorization: Bearer $TOKEN" https://api.example.com/me$TOKEN が展開されるようダブルクォートで囲む
curl -X DELETE https://api.example.com/users/42その他のメソッド
wget -c https://example.com/big.iso接続が切れた後に再開
wget -qO- https://example.com/data.json | jq .別のコマンドに直接パイプ
macOS/BSD: 標準の macOS にはありません。curl -LO を使います(再開するには curl -C - -LO)。
dig +short example.comA レコードだけ
dig MX example.comメールサーバー
dig @1.1.1.1 example.com特定のリゾルバーに問い合わせる(ローカルキャッシュを回避)
dig -x 8.8.8.8逆引き
dig +trace example.comルートから委任をたどる
パッケージ名:dnsutils(Debian/Ubuntu)、bind-utils(Fedora/RHEL)。
host example.comA、AAAA、MX を 1 つの短い結果で
nslookup example.com 8.8.8.8同じコマンドが Windows にもある
resolvectl statusインターフェースごとの DNS サーバー
sudo resolvectl flush-cachessystemd-resolved のキャッシュをクリア
macOS/BSD: macOS: sudo dscacheutil -flushcache; sudo killall -HUP mDNSResponder。
systemd-resolved を使っているシステム(Ubuntu、Fedora の標準)のみです。
ping -c 4 example.com4 パケット送ってから集計を表示
Linux と macOS の ping は、-c を付けない限り Ctrl+C を押すまで続きます(Windows は 4 回で停止)。応答がなくても停止しているとは限りません。ICMP をブロックしているホストも多くあります。
traceroute -n example.comDNS 解決なしでホップを表示
tracepath example.comroot 不要で MTU も表示
macOS/BSD: macOS には traceroute はありますが、tracepath はありません。
Linux では traceroute のインストールが必要な場合があります。tracepath(iputils)はたいてい入っています。
mtr -rw -c 100 example.comホップごとに 100 回計測してレポート
ping と traceroute を組み合わせたツールです。途中の 1 ホップだけのロスは、たいていそのルーターが ICMP の優先度を下げているだけです。最後までロスが続く場合は本物です。
ssh alice@203.0.113.10ログイン
ssh -p 2222 alice@host標準以外のポート
ssh alice@host 'df -h'コマンドを 1 つ実行して戻る
ssh -J bastion.example.com alice@10.0.0.5踏み台サーバーを経由
ssh -N -L 5432:localhost:5432 alice@db-hostローカルの DB クライアントをリモートの Postgres に接続
ssh -N -D 1080 alice@hostサーバー経由でブラウズ
ssh-keygen -t ed25519 -C "you@example.com"~/.ssh に新しい鍵ペアを作成
ssh-copy-id alice@host公開鍵をサーバーの authorized_keys に追記
ssh-keygen -R hostサーバー再構築後に古いホスト鍵を削除(「REMOTE HOST IDENTIFICATION HAS CHANGED」)
Host web
HostName 203.0.113.10
User deploy
Port 2222
IdentityFile ~/.ssh/id_ed25519以後は ssh web だけで接続(scp と rsync も使う)
scp report.pdf alice@host:/tmp/アップロード
scp alice@host:/var/log/app.log .ダウンロード
scp -r -P 2222 site/ alice@host:~/別のポートでフォルダーをアップロード
OpenSSH 9.0 以降、scp は内部で SFTP プロトコルを使います。大きなファイルや繰り返しのコピーには、差分だけを送る rsync のほうが高速です。
rsync -avzP site/ deploy@host:/srv/site/site/ の末尾のスラッシュで、フォルダー自体ではなく中身をコピー
rsync -av --exclude 'node_modules' ./ /backup/app/不要なものを除いてローカルにバックアップ
macOS/BSD: 最近の macOS には rsync ではなく openrsync が入っています。一般的なオプションは使えますが、あまり使われないものの一部は使えません。
src/ は「src の中身」、スラッシュなしの src は「src フォルダー」を意味します。これを間違えるとフォルダーが入れ子になります(dest/src/…)。
rsync -avn --delete site/ /srv/site/まずドライラン:「deleting」で始まる行が削除されるもの
rsync -av --delete site/ /srv/site/その後で本番実行
危険: コピー元にないものはコピー先からすべて削除されます。コピー元とコピー先を取り違えたり、コピー元のパスが空や間違いだったりすると、コピー先が消去されます。必ず先に -n を付けて実行してください。
nc -zv db.internal 5432「succeeded」か「Connection refused」/タイムアウト
nc -l 9000ポートで待ち受け、反対側からファイアウォールをテスト
オプションは netcat の種類によって異なります。従来版では nc -l -p 9000 とする必要があります。
sudo ufw status verboseルールとデフォルトポリシー
sudo ufw allow 22/tcpSSH を許可(enable の前に実行)
sudo ufw allow from 10.0.0.0/8 to any port 54321 つのポートを 1 つのネットワークに許可
危険: リモートサーバーで先に SSH を許可せずに(ufw allow OpenSSH または 22/tcp)sudo ufw enable を実行すると、ログインできなくなります。
sudo firewall-cmd --list-allアクティブなゾーンとルール
sudo firewall-cmd --permanent --add-service=https && sudo firewall-cmd --reloadHTTPS を恒久的に開放
sudo firewall-cmd --permanent --add-port=8080/tcpポートを開放
--permanent を付けないと、ルールは次の再読み込みか再起動まで有効です。
nmcli device statusインターフェースと接続状態
nmcli device wifi list近くのネットワーク
nmcli device wifi connect 'MyWiFi' password 'secret'ネットワークに接続
主要な 4 つのパッケージマネージャーで同じ操作を比較します:Debian/Ubuntu(apt)、Fedora/RHEL(dnf)、Arch(pacman)、openSUSE(zypper)。システムを変更する操作には sudo を付けてください。
| 操作 | apt(Debian、Ubuntu) | dnf(Fedora、RHEL) | pacman(Arch) | zypper(openSUSE) |
|---|---|---|---|---|
| パッケージリストを更新 # dnf はメタデータが古くなると自動で更新します。Arch では pacman -Sy の後に -S pkg を実行しないでください。部分アップグレードはサポートされていないため、-Syu を使います。 | apt update | dnf makecache | pacman -Sy | zypper refresh |
| すべてアップグレード # openSUSE Tumbleweed では zypper dup を使います。apt full-upgrade は、アップグレードを完了するために必要ならパッケージの削除も行います。 | apt update && apt upgrade | dnf upgrade | pacman -Syu | zypper update |
| パッケージをインストール # | apt install nginx | dnf install nginx | pacman -S nginx | zypper install nginx |
| ダウンロードしたパッケージファイルをインストール # ./ を付けると apt はパッケージ名ではなくファイルとして扱い、依存関係を解決します(dpkg -i は解決しません)。 | apt install ./app.deb | dnf install ./app.rpm | pacman -U app.pkg.tar.zst | zypper install ./app.rpm |
| パッケージを削除 # | apt remove nginx | dnf remove nginx | pacman -R nginx | zypper remove nginx |
| 設定ファイル・不要な依存関係ごと削除 # | apt purge nginx && apt autoremove | dnf remove nginx && dnf autoremove | pacman -Rns nginx | zypper remove --clean-deps nginx |
| パッケージを検索 # | apt search keyword | dnf search keyword | pacman -Ss keyword | zypper search keyword |
| パッケージの詳細を表示 # | apt show nginx | dnf info nginx | pacman -Si nginx (installed: -Qi) | zypper info nginx |
| インストール済みパッケージを一覧表示 # | apt list --installed | dnf list --installed | pacman -Q | zypper search --installed-only |
| 利用可能な更新を一覧表示 # | apt list --upgradable | dnf check-update | checkupdates (pacman-contrib) | zypper list-updates |
| ファイルがどのパッケージのものか調べる # まだインストールしていないファイルの場合:dnf provides /path、apt-file search path(apt-file が必要)、pacman -F path。 | dpkg -S /usr/bin/curl | rpm -qf /usr/bin/curl | pacman -Qo /usr/bin/curl | rpm -qf /usr/bin/curl |
| パッケージがインストールしたファイルを一覧表示 # | dpkg -L nginx | rpm -ql nginx | pacman -Ql nginx | rpm -ql nginx |
| パッケージを現在のバージョンに固定 # DNF 4 では、versionlock を使うには versionlock プラグインのパッケージが必要です。 | apt-mark hold nginx | dnf versionlock add nginx | IgnorePkg = nginx in /etc/pacman.conf | zypper addlock nginx |
| パッケージキャッシュを削除 # | apt clean | dnf clean all | pacman -Sc | zypper clean |
自分が誰か、誰がログインしているかの確認と、アカウントの管理。
iduid、gid、所属するすべてのグループ
id alice別のユーザー
wログイン中のユーザーと実行中のもの
last -n 10最近のログインと再起動
sudo lastb -n 10最近のログイン失敗(Linux)
sudo useradd -m -s /bin/bash alice && sudo passwd alice作成してパスワードを設定
Debian/Ubuntu では、adduser alice がホームディレクトリとパスワードを設定してくれる、より使いやすい対話型のラッパーです。
sudo usermod -aG docker alicealice が docker を使えるようにする
sudo usermod -aG sudo aliceDebian/Ubuntu で管理者にする(Fedora/RHEL/Arch ではグループ名は wheel)
危険: -a を付けないと、usermod -G はユーザーの補助グループをすべて置き換え、sudo 権限が外れることがあります。グループの変更は次回のログインから反映されます(または newgrp docker を実行)。
sudo userdel -r olduserホームディレクトリとメールスプールも削除
危険: -r を付けるとホームディレクトリとそのファイルが完全に削除されます。先にバックアップするか、代わりにアカウントをロックしてください(passwd -l)。
passwd自分のパスワードを変更
sudo passwd alice他のユーザーのパスワードをリセット
sudo passwd -l aliceパスワードでのログインをロック(SSH 鍵では引き続きログインできる場合あり)
sudo groupadd developers新しいグループ
sudo gpasswd -d alice developersalice をグループから外す
groups alicealice の所属グループ
getent group sudosudo グループのメンバー(LDAP でも動作)
getent passwd aliceアカウント情報:UID、ホーム、シェル
sudo visudo -f /etc/sudoers.d/deployルールごとに別ファイル
deploy ALL=(ALL) NOPASSWD: /usr/bin/systemctl restart myapp1 つのコマンドだけパスワードなしで許可
visudo は保存前に構文をチェックします。通常のエディターで /etc/sudoers を編集してタイプミスをすると、誰も sudo を使えなくなることがあります。
sudo chage -l alice最終変更日と有効期限
sudo chage -M 90 alice90 日ごとに期限切れにする
tar、gzip、xz、zip とチェックサム。
tar -czf site-2026-10-18.tar.gz site/フォルダーを gzip 圧縮したアーカイブ
tar -cJf logs.tar.xz --exclude='*.tmp' logs/一時ファイルを除いた、より小さな xz アーカイブ
tar -xf archive.tar.gzGNU tar と macOS の tar は圧縮形式を自動で判別する
tar -xzf app.tar.gz -C /opt/app --strip-components=1外側のディレクトリを除いてフォルダーに展開
tar -tf backup.tar.gz | less展開せずに中身を確認
tar -xf backup.tar.gz etc/nginx/nginx.conf1 つのファイルを取り出す(パスは -t の表示どおり)
tar --zstd -cf data.tar.zst data/xz よりはるかに高速で、圧縮率は gzip -9 と同等かそれ以上
zstd -d file.zst単一ファイルを解凍
GNU tar 1.31 以降(または最近の bsdtar)と zstd プログラムが必要です。
gzip -k access.logaccess.log.gz を作成し、元のファイルも残す
zcat access.log.gz | grep 404ディスクに解凍せずに読む
zgrep 500 access.log.*.gzローテーション済みのログを直接 grep
-k を付けないと、gzip は元のファイルを .gz 版で置き換えます。
xz -T0 -k big.sqlすべての CPU コアを使い、元のファイルを残す
unxz big.sql.xz解凍
zip -r site.zip site/フォルダーを zip 圧縮
zip -r site.zip site/ -x '*.git*' '*/node_modules/*'パスを除外
zip -e は旧式の ZipCrypto 方式で暗号化するため、強度が低いです。本当に秘密にしたいなら 7z か gpg を使ってください。
unzip files.zip -d files/フォルダーに展開
unzip -l files.zip中身を一覧表示するだけ
unzip -o files.zip確認せずに上書き
7z x archive.7zパスを保ったまま展開
7z a -p backup.7z docs/AES-256 で暗号化したアーカイブ(パスワードの入力を求められる)
7z l archive.rarさまざまな形式の中身を一覧表示
パッケージ:Debian/Ubuntu では p7zip-full / 7zip、Fedora/Arch では p7zip または 7zip。
sha256sum ubuntu.isoダウンロードページのハッシュと比較
sha256sum -c SHA256SUMS --ignore-missing一覧にあるファイルのうち、手元にあるものをすべて検証
macOS/BSD: macOS: shasum -a 256 file(および shasum -a 256 -c SUMSFILE)。
split -b 100M backup.tar.gz backup.part.backup.part.aa、.ab、…
cat backup.part.* > backup.tar.gz再び結合
名前・更新日時・サイズでファイルを探し、ファイル内のテキストを検索します。
find . -name '*.log'シェルに先に展開されないようパターンをクォートで囲む
find / -iname 'nginx.conf' 2>/dev/null全体を検索し、権限エラーを非表示
find . -maxdepth 1 -type d直下のサブディレクトリ
find . -type l -xtype lリンク切れのシンボリックリンク(GNU)
find . -type f -empty空のファイル
find /var/log -type f -mtime +3030 日より古いログ
find . -type f -mmin -15直近 15 分で変更されたもの
sudo find / -xdev -type f -size +500M -exec ls -lh {} + 2>/dev/nullルートファイルシステム上の 500 MB を超えるファイル
find . -name '*.sh' -exec chmod +x {} +{} + で 1 回のコマンドに多数のファイルを渡す(高速)
find . -name '*.py' -exec grep -l 'TODO' {} +TODO を含む Python ファイル
find . -name '*.jpg' -print0 | xargs -0 -P4 -n 20 jpegoptim並列処理。名前にスペースがあっても安全
find /tmp/app -name '*.tmp' -mtime +7 -print手順 1: 一致するものを一覧表示
find /tmp/app -name '*.tmp' -mtime +7 -delete手順 2: 同じコマンドの最後に -delete を付ける
危険: 順番が重要です。-delete は書いた位置で実行されるため、find . -delete -name "*.tmp" は名前の条件が適用される前に . 以下のすべてを削除します。-delete は最後に置き、先に -print で実行してください。
find /srv -type f -perm -o+w誰でも書き込めるファイル
sudo find / -xdev -perm -4000 -type f 2>/dev/nullsetuid が付いたプログラム
locate -i nginx.conffind / よりはるかに高速
sudo updatedb今すぐインデックスを更新
plocate または mlocate が提供します。インデックスは毎日再構築されるため、今日作成したファイルは updatedb が実行されるまで見つからないことがあります。
grep -n 'ERROR' app.log一致した行を行番号付きで
grep -v '^#' nginx.conf | grep -v '^$'コメントと空行を除いた設定
grep -c 'Failed password' /var/log/auth.logSSH ログインの失敗回数を数える
grep -rn 'TODO' src/すべての TODO をファイル名と行番号付きで
grep -rl --include='*.php' 'mysql_connect' .古い API をまだ使っている PHP ファイル
grep -rn --exclude-dir={.git,node_modules} 'apiKey' .余計なフォルダーを除外
grep -C 3 'Traceback' app.log前後 3 行
grep -A 20 'Exception' app.logエラーの後に続くスタックトレース
grep -E 'error|warn' app.logどちらかの単語(拡張正規表現)
grep -Eo '[0-9]{1,3}(\.[0-9]{1,3}){3}' access.log | sort | uniq -c | sort -rn | headログ内で多い IP アドレス
grep -P '\d{4}-\d{2}-\d{2}' filePerl 形式の \d(GNU grep)
macOS/BSD: -E はどこでも使えます。-P(PCRE)は GNU の機能で、macOS のリリースによっては使えません。
type llエイリアス、関数、組み込みコマンド、ファイルのどれかがわかる
command -v docker >/dev/null || echo "docker missing"スクリプトで使える移植性のあるチェック
which -a python3PATH 上のすべての python3 を順番に表示
テキストや JSON の切り出し、絞り込み、並べ替え、集計、変換、整形。
sed 's/http:/https:/g' links.txt結果を表示。ファイルは変更されない
sed 's|/usr/local|/opt|g' paths.txt区切り文字は自由。パスに便利
sed -E 's/([0-9]+)px/\1rem/g' style.cssキャプチャしたグループを再利用
sed -i 's/^#Port 22/Port 2222/' /etc/ssh/sshd_configGNU sed
sed -i.bak 's/foo/bar/g' config.iniconfig.ini.bak を残す。GNU と macOS の両方で動作
macOS/BSD: macOS の sed では -i の後に引数が必要です:sed -i '' 's/foo/bar/g' file。GNU sed は '' をスクリプトとして読むため、両方で動くのは -i.bak の形式だけです。
sed -n '100,120p' big.log100〜120 行目
sed '/^\s*#/d; /^$/d' app.confコメントと空行を取り除く(GNU の \s)
sed -n '/BEGIN CERT/,/END CERT/p' bundle.pem2 つの目印の間にあるすべて
awk '{print $1}' access.log1 列目(クライアント IP)
awk -F: '{print $1, $7}' /etc/passwdユーザーとシェル
awk -F, 'NR>1 {print $2}' data.csvヘッダーを飛ばして CSV の 2 列目(クォート内にカンマがない単純な CSV のみ)
awk '$9 >= 500' access.log9 番目のフィールド(ステータス)が 5xx の行
awk '{s += $2} END {print s}' sales.txt2 列目の合計
awk '{c[$1]++} END {for (k in c) print c[k], k}' access.log | sort -rn | head値ごとに数えて上位 10 件
cut -d, -f1,3 data.csv1 列目と 3 列目
cut -d: -f1 /etc/passwdすべてのユーザー名
cut -c1-10 file各行の先頭 10 文字
cut は区切り文字ごとにフィールドを区切るため、スペースが 2 つ続くと空のフィールドになります。スペースで整列された出力には awk を使ってください。
du -sh * | sort -hフォルダーをサイズ順に
sort -t, -k3,3nr data.csvCSV を 3 列目の数値で降順に
sort -u emails.txt > unique.txt並べ替えて重複を除く
sort ips.txt | uniq -c | sort -rn | head出現回数の多い行の上位 10 件
uniq は隣り合う重複しかまとめないため、先に sort してください。
wc -l access.log行数
ls | wc -lこのフォルダー内の項目数
grep -c '' file改行で終わらない最終行も含めた行数
tr 'a-z' 'A-Z' < in.txt大文字に変換
tr -d '\r' < windows.txt > unix.txtWindows の CRLF 改行を取り除く
tr -s ' ' < file連続するスペースを 1 つにまとめる
tr '\n' ',' < list.txt行をカンマでつなぐ
tr は標準入力しか読まないため、< でファイルをリダイレクトします。
find . -name '*.log' -print0 | xargs -0 rm -f見つかったファイルを安全に削除
cat urls.txt | xargs -n 1 -P 4 curl -sO4 つずつ同時にダウンロード
ls *.png | xargs -I {} cp {} /backup/{}項目ごとに 1 回コマンドを実行
macOS/BSD: GNU の xargs は、-r を付けない限り入力が空でもコマンドを 1 回実行します。macOS の xargs はデフォルトで空の入力をスキップし、互換性のために -r も受け付けます。
jq . response.json整形して表示
jq -r '.items[].name' data.json1 行に 1 つずつ名前を表示
jq -r '.[] | select(.active) | .email' users.json絞り込んでからフィールドを取り出す
curl -s https://api.github.com/repos/jqlang/jq | jq '.stargazers_count'API から直接
apt/dnf install jq でインストールします。最近の macOS には標準で入っています。
paste -sd, ids.txtすべての行をカンマでつなぐ
paste names.txt emails.txt2 つのファイルを 2 列として並べる
comm -12 <(sort a.txt) <(sort b.txt)両方にある
comm -23 <(sort a.txt) <(sort b.txt)a.txt にだけある
seq 1 51 から 5 まで、1 行に 1 つ
seq -w 1 10ゼロ埋め:01 … 10
for i in $(seq 1 3); do echo "run $i"; doneループのカウンター
printf '%s' 'user:pass' | base64エンコード(printf なら末尾に改行が付かない)
echo dXNlcjpwYXNz | base64 -dデコード
base64 -w 0 image.png > image.b64折り返しなし(GNU は 76 文字で折り返す)
macOS/BSD: macOS の base64 はデフォルトで折り返さず、-w もありません。デコードには -d を使います(古い macOS では -D)。
iconv -f WINDOWS-1252 -t UTF-8 old.csv > new.csvExcel から書き出したファイルの文字化けを直す
iconv -l対応している文字コードを一覧表示
shuf -n 1 names.txtランダムに 1 行
shuf -i 1-100 -n 51〜100 からランダムに 5 つの数
systemd サービスの開始・停止・起動時の有効化と、journalctl によるログの確認。
systemctl status nginx状態、PID、メモリ、最新のログ行
systemctl is-active --quiet nginx && echo upスクリプト用
sudo systemctl restart nginx完全に再起動
sudo systemctl reload nginx接続を切らずに設定を再読み込み(サービスが対応していれば)
タイプミスでサイトが落ちないよう、可能なら再起動の前に設定をテストしてください(例:sudo nginx -t)。
sudo systemctl enable --now docker自動起動を有効にして今すぐ開始
sudo systemctl disable --now cups今すぐ停止し、自動起動も無効化
sudo systemctl mask bluetooth一切起動できないようにする(元に戻すには unmask)
systemctl --failed失敗したもの
systemctl list-units --type=service --state=running実行中のもの
systemctl list-unit-files --state=enabled起動時に開始されるもの
sudo systemctl edit nginxパッケージを更新しても残るドロップイン設定で上書き
systemctl cat nginxユニットとすべての上書き設定
sudo systemctl daemon-reloadユニットファイルを手で編集した後に必要
[Unit]
Description=My app
After=network.target
[Service]
User=app
WorkingDirectory=/srv/app
ExecStart=/srv/app/bin/server
Restart=on-failure
[Install]
WantedBy=multi-user.targetその後:sudo systemctl daemon-reload && sudo systemctl enable --now myapp
journalctl -u nginx -f1 つのサービスを追跡
journalctl -u myapp --since '10 min ago'直近の期間
journalctl -b -1 -p errクラッシュ前の起動時のエラー
journalctl --disk-usageログが使っている容量
sudo journalctl --vacuum-size=500Mアーカイブ済みログを最大 500 MB に抑える
sudo journalctl --vacuum-time=14d2 週間より古いアーカイブ済みログを削除
恒久的に制限するには、/etc/systemd/journald.conf で SystemMaxUse= を設定します。
sudo tail -f /var/log/syslogDebian/Ubuntu の一般ログ(Fedora/RHEL では /var/log/messages)
sudo tail -f /var/log/auth.logDebian/Ubuntu のログインと sudo の記録(RHEL では /var/log/secure)
一部のディストリビューション(Fedora、Arch)では、rsyslog をインストールしない限りログはジャーナルにしか残りません。
sudo reboot今すぐ再起動
sudo shutdown -r +10 'Kernel update'ログイン中のユーザーに警告して 10 分後に再起動
sudo shutdown -c予約したシャットダウンを取り消す
sudo shutdown -h now電源オフ
コマンドを定期的に、または後で 1 回だけ実行します。
crontab -e$EDITOR で自分の crontab を開く
crontab -l一覧表示
crontab -l > crontab.bakバックアップ
30 2 * * * /usr/local/bin/backup.sh >> /var/log/backup.log 2>&1毎日 02:30 に実行し、出力を残す
*/15 * * * * /usr/local/bin/check.sh15 分ごと
0 9 * * 1-5 /usr/local/bin/report.sh月曜〜金曜の 09:00
@reboot /usr/local/bin/startup.sh起動時に 1 回
cron は最小限の PATH で、シェルのプロファイルを読まずに実行されます。絶対パスを使ってください。コマンド内の % は \% とエスケープする必要があります。
crontab -l > ~/crontab.bak && crontab -r削除する前にバックアップ
crontab ~/crontab.bakファイルから復元
危険: 確認なしで cron ジョブをすべて削除します。しかも r はキーボード上で e のすぐ隣です。cron の実装によっては、先に確認する -i が使えます(crontab -ri)。
0 3 * * * root /usr/local/bin/cleanup.sh/etc/cron.d/cleanup の行:ユーザーのフィールドが追加されている点に注意
ls /etc/cron.daily/run-parts が 1 日 1 回実行するスクリプト
Debian と Ubuntu では、/etc/cron.d 内で名前にドットを含むファイルは無視されます。backup.cron ではなく backup という名前にしてください。
echo 'systemctl restart myapp' | sudo at 02:00今夜 2 時に
echo './report.sh' | at now + 30 minutes30 分後に
atq待機中のジョブ
atrm 3ジョブ 3 を取り消す
at パッケージと、実行中の atd サービスが必要です。
systemctl list-timersすべてのタイマーと次回の実行時刻
[Timer]
OnCalendar=*-*-* 02:30:00
Persistent=true
[Install]
WantedBy=timers.targetbackup.service の隣に backup.timer を置く。Persistent で停止中の分を後から実行
systemd-analyze calendar 'Mon..Fri 09:00'OnCalendar 式の意味を確認
sleep 5 && curl -s localhost:8080/healthサービスが起動するまで待つ
sleep 2m単位の接尾辞は GNU と現在の macOS で使える
パイプ、リダイレクト、グロブ、変数、履歴、そして時間を最も節約できるキー操作。macOS のデフォルトは zsh ですが、shopt、help、bash 4 の機能(macOS の bash は 3.2)を除けば、ほぼすべてそのまま使えます。
ps aux | grep nginx一覧を絞り込む
history | grep 'docker run'以前実行したコマンドを探す
set -o pipefailスクリプト内で:最後だけでなく、どこか 1 つでも失敗したらパイプライン全体を失敗にする
ls -l > listing.txt上書き(ファイルがなければ作成)
echo 'done' >> progress.log追記
set -o noclobber> で既存のファイルを上書きしないようにする(>| で強制)
シェルはコマンドの実行前にファイルを空にするため、sort file > file を実行するとファイルが空になります。別の名前で書き出してから mv してください。
find / -name x 2>/dev/nullエラーメッセージを捨てる
./build.sh > build.log 2>&1出力とエラーを 1 つのファイルに(順番が重要:先に >、次に 2>&1)
./build.sh &> build.log同じことを bash の短縮形で
mysql mydb < dump.sqlファイルを入力に
cat > config.yml <<'EOF'
port: 8080
host: $HOST stays literal
EOF'EOF' をクォートすると $変数が展開されない
grep -c a <<< "banana"ヒアストリング
make && sudo make installビルドが成功したときだけインストール
cd /srv/app || exit 1cd に失敗したらスクリプトを止める
(cd frontend && npm run build)括弧はサブシェルなので、現在のディレクトリは変わらない
echo "Today is $(date +%A)"コマンド置換
echo $(( 1024 * 4 ))整数の計算
diff <(ls dir1) <(ls dir2)プロセス置換:出力を一時ファイルのように扱う
バッククォートの `command` は $(command) の古い書き方です。$( ) は入れ子にでき、読みやすくなります。
ls *.jpgこのフォルダー内のすべての JPG
rm photo-??.pngphoto-01.png … photo-99.png
cp config.{yml,yml.bak}ブレース展開:cp config.yml config.yml.bak
shopt -s globstar; ls **/*.md** は任意の深さに一致(bash 4 以降)
グロブはデフォルトではドットファイルに一致しません(shopt -s dotglob で変更可能)。何も一致しない場合、shopt -s nullglob を設定していなければ bash はパターンをそのまま渡します。
echo 'Cost: $5'シングルクォート:何も展開されない
echo "Home is $HOME"ダブルクォート:変数は展開され、スペースは保たれる
cp "$file" "$dest/"パスを入れた変数は必ずクォートする。クォートしないとスペースで分割される
name="Ada"; echo "Hi $name"設定して使用
echo "${PORT:-8080}"未設定または空のときのデフォルト値
file=report.tar.gz; echo "${file%%.*}" "${file##*/}"拡張子を除く / ディレクトリを除く
echo "${#name}"文字列の長さ
export NODE_ENV=productionこのシェルから起動するすべてのプログラムから見える
DEBUG=1 ./appそのコマンドだけに適用
printenv | sort一覧表示
unset DEBUG削除
シェルを終了すると消えます。残すには ~/.bashrc(対話型シェル)か ~/.profile(ログインシェル)に export を書いてください。
echo "$PATH" | tr : '\n'1 行に 1 エントリー
export PATH="$HOME/.local/bin:$PATH"自分の bin フォルダーを先頭に追加(~/.bashrc に追記)
hash -rバイナリを移動した後、キャッシュされたコマンドの場所を忘れさせる
alias ll='ls -alF'残すには ~/.bashrc に追記
source ~/.bashrc新しいターミナルを開かずに変更を反映(. ~/.bashrc と同じ)
\lsエイリアスを回避して本来の ls を実行
grep -q root /etc/passwd; echo $?0 は見つかった、1 は見つからない、2 はエラー
set -euo pipefailスクリプトの先頭に:エラー、未設定の変数、失敗したパイプで停止
sudo !!直前のコマンドを sudo 付きで再実行
cd !$直前のコマンドの最後の引数を使う
!42履歴の 42 行目を再実行
^foo^bar直前のコマンドの foo を bar に置き換えて再実行
HISTCONTROL=ignorespace(Ubuntu では ignoreboth の一部としてデフォルト)なら、先頭にスペースを付けて入力したコマンドは保存されません。機密情報を含むコマンドに便利です。
bind -P | lessすべてのキー割り当てを一覧表示
man rsync完全なマニュアル。/ で検索、q で終了
man 5 crontabセクション 5: コマンドではなくファイル形式の説明
help cdbash の組み込みコマンドには専用の man ページがない
apropos partitionある単語に言及しているコマンドを探す
#!/usr/bin/env bash
set -euo pipefail
name="${1:-world}"
if [[ -f "$name.txt" ]]; then
echo "found $name.txt"
fi
for f in *.log; do
echo "$f"
done引数、条件判定、ループ
chmod +x script.sh && ./script.sh Ada実行可能にして実行
bash -x script.sh実行される各行をトレース
$1 … $9 は引数、"$@" はすべての引数、$# は引数の数です。[[ ]] は bash の構文なので、POSIX sh のスクリプトでは [ ] を使います。
resetバイナリファイルを cat してターミナルに意味不明な文字が出るようになったとき
不具合や改善できそうな点を見つけましたか?いただいたメッセージはすべて読み、すぐに対応します。
この Linux コマンド チートシートは、200 以上のコマンドをやりたい作業ごとにまとめています。ファイル間の移動と管理、権限、プロセス、ディスク容量、ネットワーク、パッケージ、ユーザー、アーカイブ、検索、テキスト処理、systemd のサービスとログ、cron、そしてそれらをつなぐ bash の基本です。各項目には構文、実際に使うオプションとその 1 行の説明、コピーできる例、そして必要に応じて警告があります。用途(「free disk space」、「what is using port 8080」)やコマンド名で検索でき、どの項目にも直接リンクできます。
オプションは GNU coreutils、util-linux、procps-ng、iproute2、systemd、bash のマニュアルに従っており、これは Ubuntu、Debian、Fedora、RHEL、Arch、openSUSE に搭載されているものです。macOS で挙動が異なる場合は青い注記でその違いを説明しています。sed -i、date -d、stat -c、xargs は、一方で書いたスクリプトがもう一方で動かなくなる定番の箇所だからです。これはよく使う 90% のためのリファレンスで、man ページの代わりではありません。めったに使わないオプションについては、今でも man <command> が最も信頼できる情報源です。
まずは移動とファイル操作から:pwd、ls、cd、mkdir、cp、mv、rm、cat、less。次に man(ヘルプ)、sudo、検索用の grep と find、権限用の chmod と chown、プロセス用の ps、top、kill、ディスク容量用の df と du、リモートマシン用の ssh と scp です。パイプ(|)とリダイレクト(> と >>)は早めに覚えましょう。ほかのすべてを組み合わせられるようになります。
df -h を実行すると、マウントされているすべてのファイルシステムの空き容量が人間が読みやすい単位で表示されます。何が容量を使っているかを調べるには、ディレクトリ内で du -h -d 1 | sort -h を実行します。サブフォルダーが大きいものほど後ろに並んで表示されます。df ではディスクが満杯なのに du で何も見つからない場合、削除されたファイルがまだプロセスに開かれたままになっている可能性が高く、sudo lsof +L1 でそれらを一覧表示できます。
sudo ss -tulpn を実行すると、待ち受け中のすべての TCP と UDP のポートが、それを所有するプログラムとともに一覧表示されます。特定のポートなら sudo lsof -i :8080 です。sudo は重要で、付けないと自分のプロセスの名前しか表示されません。ss は netstat に代わるものですが、netstat も net-tools パッケージがインストールされたシステムではまだ使えます。
kill PID は SIGTERM を送り、プロセスに終了を求めて後片付け(ファイルのフラッシュ、ロックの解放、接続のクローズ)をさせます。kill -9 PID は SIGKILL を送り、これはカーネルが即座に強制するもので、プロセスは捕捉も無視もできないため、後片付けは行われません。まず普通の kill を使って数秒待ち、-9 はそれを無視するプロセスのために取っておきましょう。
macOS には BSD の sed が搭載されており、-i にはバックアップの拡張子の引数が必要です。macOS では sed -i '' 's/old/new/g' file と書きますが、Linux の GNU sed では同じコマンドが '' をスクリプトとして読むため失敗します。両方で動く形は sed -i.bak 's/old/new/g' file で、後で削除できるバックアップのコピーが残ります。
ほぼすべて同じです。中核のツールはどこでも同じ GNU と util-linux のプロジェクトから来ています。違うのは、パッケージマネージャー(Debian と Ubuntu は apt、Fedora と RHEL は dnf、Arch は pacman、openSUSE は zypper。パッケージの表で並べて比較しています)、一部のログファイルのパス、管理者グループ(sudo か wheel か)、ファイアウォールのフロントエンド(ufw か firewalld か)です。Alpine や BusyBox ベースのシステムは、オプションの少ない小型版のツールを使っています。
被害のほとんどは、ごく少数のコマンドによるものです。間違ったパスや空のパスでの rm -rf、間違ったディスクに向けた dd や mkfs、システムディレクトリへの chmod -R 777 や chown -R、コピー元とコピー先を取り違えた rsync --delete や robocopy 型のミラーリング、crontab -e のつもりの crontab -r、-a なしの usermod -G、間違った位置に -delete を置いた find などです。チートシートでは、それぞれを「危険」と表示し、具体的にどう失敗するかを記載しています。
その大半を防ぐ習慣は、まず無害な版を実行することです。rm -rf の前には同じパスで ls を実行します。find … -delete の前には同じ find を -print で実行します。rsync --delete の前には -n を付けてドライランします。dd や mkfs の前には lsblk を実行し、デバイス名を 2 回読みます。スクリプトでは $DIR ではなく ${DIR:?} と書けば、変数が空のときにパスが / になるのではなくスクリプトが中止されます。
シェルの設定も 2 つ役立ちます。スクリプトの先頭の set -euo pipefail は、不正な状態のまま続行せず最初のエラーで停止させ、set -o noclobber は > による既存ファイルの上書きを拒否させます。
macOS は Unix ですが、コマンドラインツールは GNU ではなく FreeBSD に由来しており、その違いはまさに Linux のチュートリアルからコマンドをコピーしたときに表れます。
• sed -i は macOS では引数が必要です(sed -i '' …)。-i.bak なら両方で動きます。
• macOS の date には -d がありません。タイムスタンプの変換には date -r <epoch> を、相対的な日付には date -v-2d を使います。
• stat は GNU の -c ではなく、異なる書式文字を使う -f を使います。
• macOS の xargs は初期設定で空の入力をスキップしますが、GNU の xargs は -r を指定しない限りコマンドを 1 回実行します。
• du はどちらも -d 1 を受け付けますが、--max-depth は GNU のみです。macOS の ps には --sort がありません(ps aux -m または -r を使います)。
• head -n -5、tac、free、ip、ss、timeout、watch は、標準の macOS にはありません。
Mac で GNU の挙動が必要なら、Homebrew の coreutils、gnu-sed、findutils パッケージで、g の接頭辞付き(gsed、gdate、gstat、gxargs)の GNU 版をインストールできます。
ls -l は権限を -rwxr-x--- のような 10 文字で表示します。最初の 1 文字は種類(- はファイル、d はディレクトリ、l はリンク)で、続く 9 文字は所有者、グループ、その他の全員それぞれの読み取り・書き込み・実行の 3 組です。数値では r が 4、w が 2、x が 1 で、組ごとに足し合わせるので、rwxr-x--- は 750 です。
よく使うモード:通常のファイルは 644、ディレクトリとスクリプトは 755、秘密鍵や機密情報を含むファイルは 600、~/.ssh のような非公開ディレクトリは 700。ディレクトリでの x は「中に入れる」という意味なので、ディレクトリには必要で、通常のファイルには不要です。適用する前にモードを確認したいなら、chmod 計算ツールで記号形式と 8 進数形式を相互に変換できます。