メインコンテンツへスキップ
レッスン 1 / 8推定時間: 30

高度なファイル管理

ワイルドカード、ブレース展開、高度なコピー・移動テクニックを学びます

このレッスンの学習目標

  • 高度なワイルドカードパターンを使える
  • ブレース展開で効率的にファイルを作成できる
  • rsyncを使った高度なコピーができる
  • 大量のファイルを効率的に処理できる

ワイルドカードの詳細

基本的なワイルドカードを超えて、より高度なパターンマッチングを学びます。

拡張グロブパターン

CommandAcademy Terminal
Welcome to CommandAcademy Terminal!
Type "help" to see available commands.
user@cmdac:~$

ファイルツリー

/
etc
hosts35B
passwd76B
home
user
tmp
usr
bin
share
var
log

基本的なワイルドカード:

  • * : 0文字以上の任意の文字
  • ? : 任意の1文字
  • [abc] : a, b, cのいずれか
  • [0-9] : 数字
  • [!abc] : a, b, c以外

高度なパターンマッチング

# 数字を含むファイル
ls *[0-9]*

# 特定の拡張子を除外
ls !(*.log)  # bash拡張グロブ有効時

# 複数パターンのOR
ls *.{txt,log}

# 文字範囲の指定
ls [a-f]*  # a〜fで始まるファイル

ブレース展開

ブレース展開を使うと、複数のファイルやディレクトリを効率的に作成できます。

CommandAcademy Terminal
Welcome to CommandAcademy Terminal!
Type "help" to see available commands.
user@cmdac:~$

ファイルツリー

/
etc
hosts35B
passwd76B
home
user
tmp
usr
bin
share
var
log

ブレース展開の例:

# 連番ファイルの作成
touch file{1..10}.txt

# 複数の拡張子
touch document.{txt,pdf,docx}

# ネストした展開
mkdir -p project/{src,test}/{js,css}

実践的なブレース展開

# 日付付きバックアップディレクトリ
mkdir backup_{2024..2025}_{01..12}

# 複雑なプロジェクト構造
mkdir -p app/{frontend/{components,styles,utils},backend/{api,models,config}}

# 設定ファイルのテンプレート作成
touch config.{development,staging,production}.json

rsync - 高度なファイル同期

rsyncは、ローカルまたはリモート間でファイルを効率的に同期するツールです。

rsyncの基本

CommandAcademy Terminal
Welcome to CommandAcademy Terminal!
Type "help" to see available commands.
user@cmdac:~$

ファイルツリー

/
etc
hosts35B
passwd76B
home
user
tmp
usr
bin
share
var
log

rsyncの基本オプション:

  • -a : アーカイブモード(権限、タイムスタンプ保持)
  • -v : 詳細表示
  • -h : 人間が読みやすい形式
  • --progress : 進捗表示

rsyncの活用例

# 基本的な同期
rsync -av source/ dest/

# 差分のみコピー
rsync -av --update source/ dest/

# 削除されたファイルも同期
rsync -av --delete source/ dest/

# 除外パターン
rsync -av --exclude='*.log' --exclude='node_modules/' source/ dest/

# ドライラン(実際には実行しない)
rsync -av --dry-run source/ dest/

リモート同期

# SSHを使ったリモート同期
rsync -av -e ssh local/ user@remote:/path/to/dest/

# 帯域制限付き
rsync -av --bwlimit=1000 source/ dest/  # 1000KB/s

# 圧縮転送
rsync -avz source/ dest/

xargs - コマンドライン引数の構築

xargsは、標準入力からコマンドライン引数を構築して実行します。

CommandAcademy Terminal
Welcome to CommandAcademy Terminal!
Type "help" to see available commands.
user@cmdac:~$

ファイルツリー

/
etc
hosts35B
passwd76B
home
user
tmp
usr
bin
share
var
log

xargsの便利な使い方:

  • -I {} : プレースホルダーを指定
  • -n : 引数の数を制限
  • -P : 並列実行
  • -0 : null文字区切り(findと組み合わせ)

xargsの実践例

# ファイル一括処理
find . -name "*.txt" -print0 | xargs -0 grep "pattern"

# 並列実行
find . -name "*.jpg" | xargs -P 4 -I {} convert {} {}.png

# 一定数ごとに処理
echo {1..100} | xargs -n 10 echo

# ファイルから引数を読み込み
cat filelist.txt | xargs rm -f

# 複雑なコマンドの実行
find . -name "*.log" | xargs -I {} sh -c 'echo "Processing: {}" && gzip {}'

大量ファイルの効率的な処理

バッチ処理のテクニック

CommandAcademy Terminal
Welcome to CommandAcademy Terminal!
Type "help" to see available commands.
user@cmdac:~$

ファイルツリー

/
etc
hosts35B
passwd76B
home
user
tmp
usr
bin
share
var
log
# 100個ずつ処理
ls *.csv | xargs -n 100 tar -czf batch.tar.gz

# 拡張子の一括変更
for file in *.txt; do mv "$file" "${file%.txt}.bak"; done

# parallel コマンドを使った並列処理
ls *.csv | parallel -j 4 'process_data.sh {}'

メモリ効率の良い処理

# 巨大なディレクトリのファイル数カウント
find . -type f | wc -l

# ストリーミング処理
find . -name "*.log" -exec grep -l "ERROR" {} + | head -100

# 分割処理
split -l 1000 bigfile.txt chunk_

ファイル名の一括変更

renameコマンド

# Perl版rename(多くのLinuxディストリビューション)
rename 's/old/new/' *.txt
rename 's/.jpeg$/.jpg/' *.jpeg

# 大文字を小文字に
rename 'y/A-Z/a-z/' *

# 空白をアンダースコアに
rename 's/ /_/g' *

bashでの一括変更

CommandAcademy Terminal
Welcome to CommandAcademy Terminal!
Type "help" to see available commands.
user@cmdac:~$

ファイルツリー

/
etc
hosts35B
passwd76B
home
user
tmp
usr
bin
share
var
log
# 空白をアンダースコアに置換
for f in *' '*; do mv "$f" "${f// /_}"; done

# プレフィックスを追加
for f in *.txt; do mv "$f" "backup_$f"; done

# 日付を追加
for f in *.log; do mv "$f" "$(date +%Y%m%d)_$f"; done

実践演習

演習1:プロジェクトテンプレートの作成

CommandAcademy Terminal
Welcome to CommandAcademy Terminal!
Type "help" to see available commands.
user@cmdac:~$

ファイルツリー

/
etc
hosts35B
passwd76B
home
user
tmp
usr
bin
share
var
log

複数のWebプロジェクト用のテンプレート構造を効率的に作成してください。

解答例:

# ブレース展開で構造作成
mkdir -p template/{project1,project2,project3}/{src/{js,css,images},docs,tests}

# 共通ファイルを作成
for proj in project{1..3}; do
  touch template/$proj/{README.md,.gitignore,package.json}
  echo "# $proj" > template/$proj/README.md
done

# rsyncで配布
rsync -av template/project1/ ../new_project/

演習2:ログファイルの整理

CommandAcademy Terminal
Welcome to CommandAcademy Terminal!
Type "help" to see available commands.
user@cmdac:~$

ファイルツリー

/
etc
hosts35B
passwd76B
home
user
tmp
usr
bin
share
var
log

30日分のログファイルを週ごとにアーカイブしてください。

解答例:

# 週ごとにディレクトリ作成
mkdir -p week{1..4}

# ファイルを週ごとに振り分け
find . -name "*.log" -mtime -7 | xargs -I {} mv {} week1/
find . -name "*.log" -mtime -14 -mtime +7 | xargs -I {} mv {} week2/
find . -name "*.log" -mtime -21 -mtime +14 | xargs -I {} mv {} week3/
find . -name "*.log" -mtime +21 | xargs -I {} mv {} week4/

# 各週をアーカイブ
for week in week*; do
  tar -czf "${week}_logs.tar.gz" "$week"
done

高度なテクニック

ハードリンクでの容量節約

# 重複ファイルを検索してハードリンク化
fdupes -r . | while read -r empty; do
  read -r file1
  read -r file2
  if [[ -n "$file1" && -n "$file2" ]]; then
    ln -f "$file1" "$file2"
  fi
done

inotifyによるファイル監視

# ファイル変更を監視
inotifywait -m -r -e modify,create,delete /path/to/watch

# 変更時に自動バックアップ
inotifywait -m -e modify important.conf | while read path event file; do
  cp important.conf "important.conf.$(date +%s).bak"
done

まとめ

このレッスンでは、高度なファイル管理テクニックを学びました:

  • 高度なワイルドカードとブレース展開
  • rsyncによる効率的なファイル同期
  • xargsを使った大量ファイルの処理
  • ファイル名の一括変更

これらのテクニックを組み合わせることで、大規模なファイル操作も効率的に行えるようになります。

💡 次のレッスンでは、ファイルの圧縮とアーカイブについて詳しく学びます。