Linux ファイル操作徹底解説 — 70+ コマンドを 11 カテゴリで
Linux のファイル操作は、サーバ案件・コンテナ案件・CI/CD 構築のすべてで土台になります。
AWS マネージドだけで完結する仕事であっても、Lambda 関数のローカル検証、CloudWatch Logs から落としたログの加工、
Terraform プロジェクトの整理で「結局ターミナルで find や tar を叩く瞬間」は必ず来ます。
本記事は私(iigtn)が普段使うコマンドを 11 カテゴリ・70+ 個に整理し、各コマンドに 主要オプション・使用例・落とし穴 を併記したリファレンスです。記事末尾に用語集を載せました。最初は通読、以降はブックマーク参照を想定しています。
sed -i, tar, find -printf など)。
その場合は brew install coreutils gnu-sed gnu-tar findutils を入れて g プレフィックスのコマンドを使うのが楽です。
目次
- ディレクトリ移動と一覧表示
- ファイルの中身を見る・作る
- コピー・移動・削除
- ファイル検索 (find / locate / which)
- 圧縮・展開 (tar / gzip / zip)
- リンク (ln / readlink)
- 権限・所有者 (chmod / chown / umask)
- ファイル情報 (stat / file / du / df)
- マウント・デバイス (mount / lsblk)
- ファイル比較・ハッシュ (diff / sha256sum)
- ファイル属性応用 (touch / xattr / lsattr)
- 用語集
1. ディレクトリ移動と一覧表示
ls — ディレクトリ内容の一覧
あらゆる作業の起点。最頻出。素の ls ではなく ls -lah で叩く癖をつけると情報量が一気に増えます。
| オプション | 意味 |
|---|---|
-l | 詳細表示(権限・サイズ・更新時刻) |
-a | ドットファイル含めて全表示 |
-h | サイズを K/M/G で表示 |
-S | サイズで降順ソート |
-t | 更新時刻で降順ソート |
-r | ソート順を逆転 |
-R | サブディレクトリも再帰 |
--color=auto | 種別で色分け(多くのディストリでデフォルト) |
# 詳細 + 隠しファイル + 人間可読サイズ(黄金パターン)
ls -lah
# サイズ大きい順 トップ 10
ls -lahS | head -n 11
# 更新が新しい順
ls -lahtr # tr で逆順 → 一番下が最新
# 拡張子ごとのファイル数
ls *.log | wc -l
ls | wc -l ではなく find . -maxdepth 1 -type f | wc -l。詳しくは find 節。
tree — ディレクトリ構造を視覚化
# 2 階層まで、ファイル数表示付き
tree -L 2 --du -h
# .git や node_modules を除外
tree -I 'node_modules|.git|.terraform' -L 3
cd / pwd / pushd / popd / dirs — ディレクトリスタック
pushd でスタックに積み、popd で戻る。複数ディレクトリを行き来する時に強力です。
cd /etc/nginx # 普通の移動
cd - # 直前のディレクトリへ戻る
pushd /var/log # スタックに積みつつ移動
pushd /tmp # さらに積む
dirs -v # スタックの中身を確認
popd # スタック先頭を pop して戻る
2. ファイルの中身を見る・作る
cat / tac — ファイル連結出力
cat /etc/os-release # 中身表示
cat -n script.sh # 行番号付き
cat file1 file2 > merged.txt # 連結して保存
tac access.log # 行を逆順に出力
cat は厳禁。ターミナルが固まります。less を使うこと。
less / more — ページャ
less は man の本体でもある必修ツール。vim ライクなキー操作。
| キー | 動作 |
|---|---|
/word | 前方検索 |
?word | 後方検索 |
n / N | 次 / 前のマッチ |
g / G | 先頭 / 末尾へ |
F | tail -f モード(追記をリアルタイム追跡) |
q | 終了 |
less /var/log/syslog
less +F /var/log/nginx/access.log # 起動と同時にライブ追跡
less -S huge.csv # 折り返さず横スクロール
zcat archive.gz | less # gz 圧縮ログを直接
head / tail — 先頭・末尾
head -n 20 file.txt # 先頭 20 行
tail -n 50 access.log # 末尾 50 行
tail -f /var/log/messages # 追記をリアルタイム表示(運用では超頻出)
tail -F app.log # F は再オープン対応 (ログローテ耐性)
tail -n +100 huge.log # 100 行目から末尾まで(先頭スキップ)
tail -f はファイル inode を握り続けるので、ログローテで「ローテ後の新ファイルを追えなくなる」事故があります。
長時間追跡するなら tail -F(大文字)を使うのが安全。
touch — 空ファイル作成 / 更新時刻書き換え
touch new.txt # 空ファイル作成 / 既存なら mtime を現在時刻に
touch -d '2026-01-01' f # mtime を任意時刻に
touch -t 202604261200 f # 同上 (フォーマット yyyymmddHHMM)
touch -a -m -r ref.txt t # ref.txt の mtime/atime を t にコピー
3. コピー・移動・削除
cp — コピー
| オプション | 意味 |
|---|---|
-r / -R | ディレクトリを再帰コピー |
-a | 属性も完全保持(権限・所有者・タイムスタンプ・シンボリックリンク) |
-i | 上書き前に確認 |
-n | 既存ファイルは上書きしない |
-u | 更新時刻が新しい時のみ上書き |
-v | 進捗を表示 |
--reflink=auto | CoW (Copy-on-Write) で瞬時にコピー (xfs/btrfs) |
cp -av src/ dst/ # 属性保持で再帰コピー(バックアップ用途の定番)
cp -r --reflink=auto big/ copy/ # CoW 対応 FS なら一瞬でコピー
cp file{,.bak} # ブレース展開で file → file.bak
mv — 移動・リネーム
mv old.txt new.txt # リネーム
mv *.log archive/ # まとめて移動
mv -i file dst/ # 上書き確認あり
mv -n file dst/ # 既存は上書きしない(事故防止)
mv -t /tmp/ a b c # ターゲット先指定(複数ソースの時に明示的)
rm — 削除
rm したら復旧は基本不可能と思ってください。
alias rm='rm -i' を CI 用シェルに仕込まないと、rm -rf $UNDEFINED/ で / が消えます(実例多数)。
| オプション | 意味 |
|---|---|
-r | 再帰 |
-f | 確認しない、存在しなくてもエラーにしない |
-i | 1 件ずつ確認 |
-I | 3 件以上 or -r 時のみ確認(実用バランス) |
-v | 削除されたファイルを表示 |
--one-file-system | マウント境界を超えない(重要な事故防止) |
rm file.txt # 単一ファイル
rm -rf node_modules/ # 高速削除(CIで頻出)
rm -ri dir/ # 1 件ずつ確認
rm --one-file-system -rf /mnt/x # マウント境界を超えない安全削除
find . -name '*.tmp' -delete # find 経由の削除(rm -rf より安全)
shred — 安全削除(上書きしてから削除)
shred -uvz secret.key # 3 回上書き + ゼロクリア + 削除
shred は伝統的な HDD 想定で、SSD / フラッシュ / ext4 ジャーナル / btrfs CoW では完全な抹消にはなりません。
機密情報の本物の抹消が必要な場合はディスク自体を破壊するか、ATA Secure Erase / NVMe Format。
4. ファイル検索 (find / locate / which)
find — 万能ファイル検索
コマンドの中で最もパワフル、かつ最もハマる。下記の組み合わせを覚えると現場で 8 割対応できます。
| 条件 | 意味 |
|---|---|
-name '*.log' | ファイル名(glob) |
-iname | 大小無視 |
-type f / d / l | ファイル / ディレクトリ / シンボリックリンク |
-size +100M | 100MB 超 (k/M/G) |
-mtime -7 | 7 日以内に更新 |
-mtime +30 | 30 日より古い |
-mmin -10 | 10 分以内に更新 |
-perm 644 | パーミッション一致 |
-user iigtn | 所有者一致 |
-empty | 空ファイル / 空ディレクトリ |
-maxdepth N | N 階層まで |
-not / ! | 否定 |
# 大きいファイル トップ 10
find . -type f -size +100M -exec ls -lh {} \; | sort -k5 -h | tail -n 10
# 30 日より古いログを圧縮
find /var/log -name '*.log' -mtime +30 -exec gzip {} \;
# ディレクトリだけリスト( git/.terraform 除外)
find . -type d \( -name .git -o -name .terraform \) -prune -o -type d -print
# .DS_Store を一括削除(macOS との混在で発生)
find . -name '.DS_Store' -delete
# 7 日以内に更新された .tf ファイル
find . -name '*.tf' -mtime -7
# 結果を null 区切りで xargs に渡す(空白入りファイル名対応)
find . -name '*.tmp' -print0 | xargs -0 rm -v
-exec ... {} \; はファイル 1 個ずつ別プロセス起動で遅いです。{} + でまとめて 1 プロセスにできます:
find . -name '*.log' -exec rm {} +
locate / updatedb — 高速検索(事前インデックス)
updatedb # インデックス更新(root 権限)
locate nginx.conf # 高速検索
locate -i Readme # 大小無視
クラウド環境ではインデックスの維持コストが見合わないので、find で済ませることが多いです。
which / whereis / type / command -v — コマンドのパス探索
which terraform # コマンドのフルパス
which -a python # 同名コマンドを全て表示(PATH 順)
whereis ssh # バイナリ + man の場所
type ls # alias / function / builtin / file かを判定
command -v aws # スクリプトで存在確認に使う ($? で判定可能)
type -a cd # cd は builtin と判明する
5. 圧縮・展開 (tar / gzip / zip)
tar — アーカイブ作成・展開
「tar xvf って覚えとけば 9 割困らない」が口コミで伝わるが、現場では下のオプションを正しく使い分けると速度が桁違い。
| オプション | 意味 |
|---|---|
c | create |
x | extract |
t | list(中身一覧) |
f file | アーカイブファイル指定 |
z | gzip 圧縮 |
j | bzip2 圧縮 |
J | xz 圧縮 |
v | verbose(展開状況表示) |
-C dir | 展開先 / 元ディレクトリ指定 |
--strip-components=N | 展開時に N 階層スキップ |
--exclude='pattern' | 除外パターン |
# アーカイブ作成(gzip 圧縮)
tar czvf backup.tar.gz src/
# 展開
tar xzvf backup.tar.gz
# 展開先を指定
tar xzvf backup.tar.gz -C /tmp/
# 中身だけ確認
tar tzvf backup.tar.gz | less
# 上位 1 階層をスキップして展開(GitHub release でよく使う)
tar xzvf release.tar.gz --strip-components=1
# 特定ファイルだけ取り出す
tar xzvf backup.tar.gz path/to/file
# 除外しながら作成
tar czvf src.tar.gz --exclude='node_modules' --exclude='.git' src/
gzip / gunzip / zcat — gzip 単体
gzip access.log # access.log.gz になる(元ファイルは消える)
gzip -k file.txt # -k で元ファイルを残す
gunzip access.log.gz # 展開
zcat access.log.gz | less # 展開せず内容を見る
zcat *.gz | grep ERROR # 圧縮ログ全体を一気に検索
zip / unzip — zip 形式
zip -r archive.zip src/ # 再帰で zip 化
unzip archive.zip # 展開
unzip -l archive.zip # 中身リスト
unzip -d /tmp/ archive.zip # 展開先指定
unzip -o archive.zip # 既存を強制上書き
6. リンク (ln / readlink)
ln — リンク作成
ハードリンクとシンボリックリンクは別物。日常で使うのは 99% シンボリックリンク (-s)。
ln -s /opt/app/current /opt/app/v1.2.3 # シンボリックリンク(typical: blue/green デプロイ)
ln -sf /new/path link # 既存リンクを強制更新
ln -snf /new/path linkdir # ディレクトリリンクを上書き(-n が大事)
ln source hardlink # ハードリンク (同 inode を共有)
-f だけ付けて -n を忘れると、ターゲットがディレクトリの場合に
リンク内に新リンクが作られて二重ネストする事故が頻発します。ln -snf をセットで覚えること。
readlink — リンクの実体を取る
readlink link # リンクが指す先
readlink -f /path/to/file # シンボリックリンクを再帰的に解決して絶対パス化(スクリプトで頻出)
realpath path # 同等
7. 権限・所有者 (chmod / chown / umask)
chmod — パーミッション変更
数値表記とシンボル表記がある。スクリプト・IaC では数値が読みやすい。
| 数値 | シンボル | 意味 |
|---|---|---|
| 4 | r | 読み |
| 2 | w | 書き |
| 1 | x | 実行 |
3 桁で 所有者・グループ・その他。755 = 所有者全権限・他は読み実行。
chmod 755 script.sh # 実行可
chmod 600 ~/.ssh/id_ed25519 # 鍵は本人のみ読み書き(必須)
chmod -R 644 docs/ # 再帰
chmod u+x script.sh # 所有者に実行権を追加(シンボル)
chmod g-w file # グループから書き権限を外す
chmod o= file # その他から全権限を外す
chmod +t /tmp # スティッキービット(自分のファイルしか消せない)
chmod 644 以上で公開されていると、ssh が WARNING: UNPROTECTED PRIVATE KEY を出して接続拒否します。600 必須。
chown / chgrp — 所有者変更
chown iigtn file # 所有者変更
chown iigtn:devs file # 所有者+グループ
chown -R www-data: /var/www # Web 配信ディレクトリ用(所有者のみ変更)
chgrp -R devs project/ # グループのみ
umask — 新規作成時のデフォルト権限マスク
umask # 現在の値を表示 (典型: 0022)
umask 0027 # その他からの読み権限も外す(厳しめ)
# umask 0022 → ファイル 644, ディレクトリ 755
# umask 0077 → ファイル 600, ディレクトリ 700 (1 ユーザマシン向け)
8. ファイル情報 (stat / file / du / df)
stat — メタ情報
stat file.txt # 詳細メタ情報
stat -c '%s %n' * # サイズと名前だけ
stat -c '%y %n' * # mtime と名前
stat -f / # ファイルシステム情報
file — ファイルタイプ判定
file mystery.bin # 中身を覗いて判定
file -i image.png # MIME タイプ
file -b * # ファイル名なしで結果のみ
du — ディスク使用量(ディレクトリ単位)
du -sh . # カレントの合計を人間可読で
du -sh */ # サブディレクトリごとの合計
du -ah . | sort -hr | head # 大きい順 トップ
du --max-depth=1 -h /var # /var の直下 1 階層だけ
du -sh --exclude='node_modules' .
du -sh がいつまでも返ってこない時は、巨大ディレクトリを探索中。別ターミナルで du --max-depth=1 で目星をつける。
df — ファイルシステム使用量
df -h # ディスク使用率(人間可読)
df -i # inode 使用率(小ファイル大量で枯れる)
df -hT # ファイルシステム種別も表示
df -h /var/lib/docker # 特定パスを含む FS のみ
df でディスク容量に余裕があるのに No space left on device が出たら inode 枯渇を疑う。
df -i で確認、犯人は大抵 node_modules や CI キャッシュ。
9. マウント・デバイス (mount / lsblk)
lsblk — ブロックデバイス一覧
lsblk # ツリー形式でディスク・パーティション
lsblk -f # ファイルシステム種別・UUID 付き
lsblk -o NAME,SIZE,FSTYPE,MOUNTPOINT
blkid / findmnt — UUID とマウント状況
sudo blkid # 全パーティションの UUID
findmnt / # ルートのマウント詳細
findmnt -t ext4 # ext4 のみ
mount / umount — マウント操作
mount # 現在のマウント状況
sudo mount /dev/sdb1 /mnt # 手動マウント
sudo mount -t nfs nfs.example.com:/share /mnt/share
sudo mount -o remount,rw / # ルートを RW で再マウント(緊急時)
sudo umount /mnt # アンマウント
sudo umount -l /mnt # 強制 lazy アンマウント(プロセス使用中時)
10. ファイル比較・ハッシュ (diff / sha256sum)
diff / cmp — ファイル比較
diff a.txt b.txt # 行差分
diff -u a.txt b.txt # unified 形式(git diff と同じ見た目)
diff -r dir1/ dir2/ # ディレクトリ再帰比較
diff -q -r dir1/ dir2/ # 差分の有無だけ表示
cmp file1 file2 # バイナリ比較(先頭からの差異オフセットを表示)
md5sum / sha256sum — ハッシュ
sha256sum file.iso # ハッシュ計算
sha256sum -c checksums.txt # checksums.txt の内容と照合
echo 'abc... file.iso' | sha256sum -c - # パイプで照合
sha256sum -c が安全。リリース提供の SHA256 と
一致しなければ転送破損 or 改ざん。MD5 は衝突が見つかっているのでセキュリティ用途には NG。
11. ファイル属性応用 (touch / xattr / lsattr)
chattr / lsattr — ext4 拡張属性
sudo chattr +i /etc/resolv.conf # 不変属性 (root でも書き換え不可) — DNS 上書き防止に
sudo chattr -i /etc/resolv.conf # 解除
lsattr /etc/ # 属性確認
setfacl / getfacl — POSIX ACL
chmod だけでは表現できない「特定ユーザに追加権限」を与える時に使用。
# 特定ユーザだけに read 追加
setfacl -m u:alice:r-- shared/file.txt
getfacl shared/file.txt
setfacl -x u:alice shared/file.txt # 削除
truncate — ファイルサイズ変更
truncate -s 0 access.log # 中身を空に(tail -F 中でもログを切り詰められる)
truncate -s 100M dummy.dat # 100MB の sparse file を一瞬で作成(テスト用)
コマンド早見表(チートシート)
# 一覧
ls -lah # 詳細 + 隠し + 人間可読
ls -lahS | head -n 11 # サイズ大きい順 トップ 10
# 検索
find . -name '*.log' -mtime +30 -delete
find . -type f -size +100M
# 圧縮
tar czvf out.tar.gz src/
tar xzvf in.tar.gz -C /tmp/
# 権限
chmod 600 ~/.ssh/id_*
chown -R www-data: /var/www
# 容量
du -sh */
df -hi
# ハッシュ
sha256sum -c checksums.txt
# 安全 rm
find . -name '*.tmp' -delete
用語集
- inode
- Linux ファイルシステム上で 1 ファイルにつき 1 個割り当てられるメタ情報の単位。ファイル本体(データブロック)とは別。
df -iで使用率を確認できる。 - ハードリンク
- 同じ inode を指す別名。ファイル本体を共有するので消費容量は変わらない。ファイルシステムをまたげない。
- シンボリックリンク (symlink)
- 「別パスを指す文字列」が入った特殊ファイル。
ln -sで作る。ファイルシステムをまたげる。リンク先が消えると壊れる (dangling)。 - パーミッション (rwx)
- 読み (r=4) / 書き (w=2) / 実行 (x=1) の組合せ。所有者・グループ・その他の 3 軸 × 3 ビット = 3 桁の 8 進数で表す(例: 755)。
- umask
- 新規ファイル / ディレクトリ作成時に「外したい権限ビット」のマスク。0022 が一般的、ファイル 644 / ディレクトリ 755 になる。
- スティッキービット
- ディレクトリに付けると「ファイルを消せるのは所有者のみ」になる特殊フラグ。
/tmpがこの状態で、誰でも書き込めるが他人のファイルは消せない仕組みを実現している。 - POSIX ACL
- chmod の 3×3 ビットだけでは表現できない「特定ユーザに権限追加」を可能にする拡張アクセス制御。
setfacl/getfaclで操作。 - chattr 不変属性 (i)
- ext4 で「root でも書き換え・削除不可」にする属性。誤上書き対策で
/etc/resolv.confに付ける運用がある。 - CoW (Copy-on-Write)
- btrfs / xfs で「コピー時はデータ実体を共有し、書き換え時に初めて分離」する仕組み。
cp --reflink=autoでこの恩恵を受けられる。 - sparse file
- ファイルサイズだけ大きく見えて実際にはディスクをほぼ消費しないファイル。
truncate -sで簡単に作れる。テスト用ダミーに便利。 - マウントポイント
- ブロックデバイスやネットワーク共有を Linux ファイルシステムツリー上の特定パスに「貼り付ける」場所。
mount /dev/sdb1 /mntなら/mntがマウントポイント。 - argument list too long
- シェル glob (
rm *など) が大量のファイルに展開されてプロセスの引数長制限を超えたときに出るエラー。find ... -deleteやxargsで回避。 - tail -f vs -F
-fは inode を握り続けるためログローテで追跡が止まる。-Fはファイル名で再オープンするのでローテに耐える。- ATA Secure Erase / NVMe Format
- ディスクのファームウェア機能で全領域をハードウェア的に消去するコマンド。
shredよりも完全な抹消手段。 - GNU coreutils vs BSD
- Linux 標準の coreutils (GNU 系) と macOS 標準 (BSD 系) では同じ
tar,sed,findでもオプションが微妙に異なる。クロスプラットフォームスクリプトを書く時に詰まりやすい。