ワイルドカードの詳細
基本的なワイルドカードを超えて、より高度なパターンマッチングを学びます。
拡張グロブパターン
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を使った大量ファイルの処理
- ファイル名の一括変更
これらのテクニックを組み合わせることで、大規模なファイル操作も効率的に行えるようになります。
💡 次のレッスンでは、ファイルの圧縮とアーカイブについて詳しく学びます。