Linux: ファイルとディレクトリの操作 — 作成 / コピー / 移動 / 削除
Linuxターミナルでは、ファイルの作成、コピー、移動、削除が数回のキー入力で完了します — マウス操作より速く、より正確です。
📋 前提条件:まず以下を完了していること
- レッスン4:ファイルシステムのナビゲーション
1. このレッスンで学ぶこと
- touch:ファイルの作成とタイムスタンプ更新
- mkdir:ディレクトリの作成(
-pによる再帰的作成を含む) - cp:ファイルとディレクトリのコピー
- mv:移動と名前変更
- rm:安全な削除(
-rfの危険性警告を含む)
2. 小明、1行でプロジェクト構造を作成する
(1) 悩み:右クリックで階層ごとにディレクトリを作成するのが面倒
小明はプロジェクトディレクトリ構造myblog/src/css、myblog/src/js、myblog/docsを作成したかったのですが、Windowsでは右クリック→新しいフォルダーで階層ごとに手動作成する必要があり — 毎回同じ繰り返し作業でした。
(2) 1コマンドで全体構造を作成
先輩エンジニアのボブがターミナルで1行入力しました:
mkdir -p myblog/{src/{css,js,img},docs}
Enterを押した後、tree myblogの結果は:
myblog/
├── src/
│ ├── css/
│ ├── js/
│ └── img/
└── docs/
小明は驚きました。開発者がターミナルを愛する理由がついに分かりました。
(3) 得られるもの:操作効率が劇的に向上
5つのファイル操作コマンドを学んだ後、小明のファイル作成と整理のスピードは「分単位」から「秒単位」になりました。
3. 知識ポイント
(1) touch — ファイルの作成またはタイムスタンプの更新
touch filename
ファイルが存在しない場合、touchは空ファイルを作成します。存在する場合、アクセス時刻と変更時刻が現在時刻に更新されます。
(2) mkdir — ディレクトリの作成
mkdir dirname # Create a single directory
mkdir -p a/b/c # Recursive creation (auto-creates parent directories if they don't exist)
mkdir dir1 dir2 dir3 # Create multiple directories at once
mkdir -p src/{css,js} # Brace expansion for batch creation
> 💡 ヒント:`mkdir -p`とブレース展開`{a,b,c}`の組み合わせは強力なbash機能 — `mkdir -p project/{src/{css,js},docs}`で1行でプロジェクトのディレクトリツリー全体を作成でき、各階層を個別に作成するよりはるかに高速です。
(3) cp — コピー
cp source destination # Copy a file
cp -r source_dir dest_dir # Recursively copy a directory
cp -i source destination # Interactive mode (confirm before overwriting)
cp -u source destination # Copy only if the source is newer
cp -v source destination # Show copy progress
cp -p source destination # Preserve file attributes (permissions/timestamps)
(4) mv — 移動と名前変更
mv oldname newname # Rename
mv file.txt /path/to/dest/ # Move file to another directory
mv dir1 dir2 # Rename if dir2 doesn't exist; move into if it does
mv -i source dest # Confirm before overwriting
mv -u source dest # Move only if source is newer
(5) rm — 削除
rm file.txt # Delete a file
rm -r dirname # Recursively delete a directory
rm -f file.txt # Force delete (no confirmation prompt)
rm -i file.txt # Interactive mode (confirm before deleting)
rm -rf dirname # Recursive force delete (⚠️ dangerous combination)
rm -rf /はシステム全体を削除します。rootでrm -rf /を絶対に実行しないでください。 日常操作では-iを使用する習慣をつけましょう。
rm -rfで削除されたファイルはゴミ箱に入らず、通常の方法では復元できません。rm -rfを使用する前に、必ず現在のディレクトリ(pwd)と削除対象のパスを確認し、誤削除を防いでください。安全対策として.bashrcにalias rm='rm -i'を追加することも検討してください。
(6) ハードリンクとシンボリックリンク
| 特徴 | ハードリンク | シンボリックリンク(symlink) |
|---|---|---|
| コマンド | ln target link_name |
ln -s target link_name |
| inode | 元ファイルと同じ | 異なる |
| ファイルシステム越え | 不可 | 可能 |
| ディレクトリのリンク | 不可 | 可能 |
| 元ファイル削除後 | リンクは有効 | リンクが壊れる(ダングリングリンク) |
| ファイルサイズ | 元ファイルと同じ | パス文字列のみを格納 |
# Hard link
ln original.txt hardlink.txt
# Symbolic link
ln -s /usr/bin/python3 python3
(7) ▶ サンプル:ファイルとディレクトリの作成
# Create empty files
touch index.html
touch style.css script.js # Create multiple at once
# Create directories
mkdir projects
mkdir -p projects/web/src/css # Recursively create nested directories
# Brace expansion (bash feature)
mkdir -p {2024,2025,2026}/{01,02,03}
# Creates: 2024/01, 2024/02, 2024/03, 2025/01, ...
出力:
TEXT2024: 01 02 03 2025: 01 02 03 2026: 01 02 03
(8) ▶ サンプル:ファイルのコピー
# Copy a single file
cp index.html index.backup.html
# Copy a directory (requires -r)
cp -r projects projects-backup
# Interactive mode to prevent accidental overwrite
cp -i important.txt /backup/
# Preserve file attributes
cp -p config.conf /backup/
出力:
TEXTcp: overwrite '/backup/important.txt'? n
(9) ▶ サンプル:移動と名前変更
# Rename a file
mv old-report.md report-2026.md
# Move to another directory
mv report.md ~/Documents/reports/
# Batch rename (using a loop)
for f in *.html; do mv "$f" "${f%.html}.htm"; done
出力:
TEXT(No output, file has been renamed)
(10) ▶ サンプル:安全な削除
# Safety first: interactive mode
rm -i file.txt
# Delete an empty directory
rmdir empty-dir
# Delete a non-empty directory
rm -r old-project/
# Use with caution (deletes without prompting)
rm -f temp.log
(11) ▶ サンプル:ワイルドカードによる一括操作
# Copy all .jpg files
cp *.jpg ~/Pictures/
# Delete all .tmp temporary files
rm *.tmp
# Move files starting with 2024
mv 2024* ~/archive/
# List files ending with a digit
ls *[0-9]
出力:
TEXTreport2024.md log2025.txt backup1.tar.gz
(12) ▶ 総合例:完全なプロジェクトディレクトリ構造を作成
# Xiao Ming creates his blog project (one line does it all)
mkdir -p myblog/{src/{css,js,img},docs,scripts,test}
# Create an HTML index file under src
touch myblog/src/index.html
# Copy as a backup
cp -r myblog myblog-backup
# Rename the backup directory
mv myblog-backup myblog-2026-07
# View the final structure
find myblog -type f -o -type d | sort
❓ よくある質問
Q:
rm -rf /は本当にシステム全体を削除しますか? A: \1
Q: ディレクトリに対するcpとmvの違いは? A:
cpはディレクトリのコピーに-rフラグが必要(再帰的)。mvは不要 — ディレクトリの移動はファイルの移動と同じコマンドです。対象ディレクトリが存在しない場合は名前変更、存在する場合はソースがその中に移動されます。
Q: スペースを含むファイル名の処理方法は? A: \1
Q: ファイルの一括名前変更方法は? A:
forループを使用:for f in *.jpg; do mv "$f" "prefix_$f"; done、または専用のrenameツール:rename 's/\.jpg$/\.png/' *.jpg。
Q: シンボリックリンクの元ファイルを削除したらどうなりますか? A: シンボリックリンクは「壊れたリンク」になります —
ls -lで赤く点滅する名前が表示され、アクセスするとNo such file or directoryエラーになります。ハードリンクは影響を受けません(元ファイルのinodeを直接指しているため)。
📖 まとめ
touchは空ファイルを作成、mkdir -pは階層ディレクトリを作成cp -rはディレクトリをコピー、mvは移動または名前変更、rm -rはディレクトリを削除- ブレース展開
{a,b,c}で一括作成が可能 lnはハードリンク、ln -sはシンボリックリンクを作成rm -rfは危険な組み合わせ — 実行前に必ず現在のディレクトリと身元を確認
📝 練習問題
- 基本(難易度 ⭐):
mkdir -pでディレクトリツリーlinux/assignments/{hw1,hw2,hw3}/{src,docs}を作成し、ブレース展開で各hwのsrcにmain.pyを作成する - 中級(難易度 ⭐⭐):hw3をhw4としてコピーして確認し、hw1/src/main.pyを削除し、
rm -rでhw2ディレクトリ全体を削除する - 上級(難易度 ⭐⭐⭐):
/etc/hostnameを指すシンボリックリンクを作成して確認し、findで作成したすべてのmain.pyを見つけて一括でmain.shに名前変更するワンライナーを作成する