Linux: ファイルとディレクトリの操作 — 作成 / コピー / 移動 / 削除

Linuxターミナルでは、ファイルの作成、コピー、移動、削除が数回のキー入力で完了します — マウス操作より速く、より正確です。

📋 前提条件:まず以下を完了していること

1. このレッスンで学ぶこと


2. 小明、1行でプロジェクト構造を作成する

(1) 悩み:右クリックで階層ごとにディレクトリを作成するのが面倒

小明はプロジェクトディレクトリ構造myblog/src/cssmyblog/src/jsmyblog/docsを作成したかったのですが、Windowsでは右クリック→新しいフォルダーで階層ごとに手動作成する必要があり — 毎回同じ繰り返し作業でした。

(2) 1コマンドで全体構造を作成

先輩エンジニアのボブがターミナルで1行入力しました:

BASH
mkdir -p myblog/{src/{css,js,img},docs}

Enterを押した後、tree myblogの結果は:

TEXT

myblog/
├── src/
│   ├── css/
│   ├── js/
│   └── img/
└── docs/

小明は驚きました。開発者がターミナルを愛する理由がついに分かりました。

(3) 得られるもの:操作効率が劇的に向上

5つのファイル操作コマンドを学んだ後、小明のファイル作成と整理のスピードは「分単位」から「秒単位」になりました。


3. 知識ポイント

(1) touch — ファイルの作成またはタイムスタンプの更新

BASH
touch filename

ファイルが存在しない場合、touchは空ファイルを作成します。存在する場合、アクセス時刻と変更時刻が現在時刻に更新されます。

(2) mkdir — ディレクトリの作成

BASH
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 — コピー

BASH
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 — 移動と名前変更

BASH
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 — 削除

BASH
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)と削除対象のパスを確認し、誤削除を防いでください。安全対策として.bashrcalias rm='rm -i'を追加することも検討してください。

(6) ハードリンクとシンボリックリンク

特徴 ハードリンク シンボリックリンク(symlink)
コマンド ln target link_name ln -s target link_name
inode 元ファイルと同じ 異なる
ファイルシステム越え 不可 可能
ディレクトリのリンク 不可 可能
元ファイル削除後 リンクは有効 リンクが壊れる(ダングリングリンク)
ファイルサイズ 元ファイルと同じ パス文字列のみを格納
TEXT
# Hard link
ln original.txt hardlink.txt

# Symbolic link
ln -s /usr/bin/python3 python3

(7) ▶ サンプル:ファイルとディレクトリの作成

BASH
# 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, ...

出力:

TEXT
2024:
01  02  03
2025:
01  02  03
2026:
01  02  03

(8) ▶ サンプル:ファイルのコピー

BASH
# 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/

出力:

TEXT
cp: overwrite '/backup/important.txt'? n

(9) ▶ サンプル:移動と名前変更

BASH
# 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) ▶ サンプル:安全な削除

TEXT
# 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) ▶ サンプル:ワイルドカードによる一括操作

BASH
# 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]

出力:

TEXT
report2024.md  log2025.txt  backup1.tar.gz

(12) ▶ 総合例:完全なプロジェクトディレクトリ構造を作成

BASH
# 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を直接指しているため)。


📖 まとめ


📝 練習問題

  1. 基本(難易度 ⭐)mkdir -pでディレクトリツリーlinux/assignments/{hw1,hw2,hw3}/{src,docs}を作成し、ブレース展開で各hwのsrcにmain.pyを作成する
  2. 中級(難易度 ⭐⭐):hw3をhw4としてコピーして確認し、hw1/src/main.pyを削除し、rm -rでhw2ディレクトリ全体を削除する
  3. 上級(難易度 ⭐⭐⭐)/etc/hostnameを指すシンボリックリンクを作成して確認し、findで作成したすべてのmain.pyを見つけて一括でmain.shに名前変更するワンライナーを作成する
Web-Tutorial.com

Web-Tutorial 技術チーム

複数の開発者によって共同維持されているプログラミングチュートリアルプラットフォーム。各チュートリアルは専門分野の開発者が執筆・レビューしています。正確で信頼性の高いコンテンツを目指しています — 問題を見つけた場合はお知らせください。

100%