クラウドストレージやバージョン管理システムを使用していると、ファイル名に自動的に追加される文字列(例:[conflicted]
、copy
、(1)
など)に悩まされることがあります。特に多数のファイルが複数のサブフォルダに散らばっている場合、手動でのリネームは非常に手間がかかります。
この記事では、Macのターミナルを使って、サブフォルダを含む複数のファイル名を一括でリネームする方法を紹介します。
解決方法:シェルスクリプトを使用
以下のシェルスクリプトを使用することで、指定したディレクトリ内のすべてのサブフォルダを含めて、特定のパターンを含むファイル名を一括で変更することができます。
#!/bin/bash
if [ -z "$1" ]; then
echo "使用方法: $0 /path/to/directory"
exit 1
fi
# 指定されたディレクトリが存在するか確認
if [ ! -d "$1" ]; then
echo "エラー: 指定されたディレクトリが存在しません: $1"
exit 1
fi
# 変更対象のファイルを表示
echo "以下のファイルが変更対象です:"
find "$1" -type f -name '*[conflicted]*' | while IFS= read -r file; do
echo "$file"
done
# 確認を求める
read -p "これらのファイル名から '[conflicted]' を削除しますか? (y/n): " confirm
if [ "$confirm" != "y" ]; then
echo "処理を中止しました"
exit 0
fi
# ファイル名の変更を実行
find "$1" -type f -name '*[conflicted]*' | while IFS= read -r file; do
newname="${file//" [conflicted]"}"
if [ "$file" != "$newname" ]; then
mv "$file" "$newname"
echo "リネーム: $file -> $newname"
fi
done
echo "処理が完了しました"
使用方法
-
スクリプトの保存
- 上記のスクリプトを任意の場所(例:
rename_script.sh
)に保存します。 - ファイル名に日本語やスペースが含まれていない方が安全です。
- 上記のスクリプトを任意の場所(例:
-
実行権限の付与
chmod +x "/path/to/rename_script.sh"
- パスに角括弧(
[]
)やスペースが含まれる場合は、必ずダブルクォート("
)で囲みます。
- パスに角括弧(
-
スクリプトの実行
"/path/to/rename_script.sh" "/path/to/target/directory"
- 対象とするディレクトリのパスを指定して実行します。
- スクリプトは実行前に変更対象のファイル一覧を表示し、確認を求めます。
スクリプトの動作説明
-
引数チェック
- ディレクトリパスが指定されているか確認
- 指定されたディレクトリが存在するか確認
-
対象ファイルの検索
-
find
コマンドで指定パターンに一致するファイルを検索 - サブフォルダも含めて再帰的に検索
-
-
確認プロンプト
- 変更対象のファイル一覧を表示
- ユーザーに確認を求める(y/nで回答)
-
リネーム処理
-
sed
コマンドでファイル名から指定パターンを削除 -
mv
コマンドで実際のリネームを実行 - 各ファイルの処理結果を表示
-
カスタマイズ方法
異なるパターンのファイル名を変更したい場合は、以下の2箇所を編集します:
-
findコマンドの検索パターン
find "$1" -type f -name '*[conflicted]*'
-
*[conflicted]*
の部分を目的のパターンに変更
-
-
パラメータ展開の置換パターン
newname="${file//" [conflicted]"}"
-
[conflicted]
の部分を削除したい文字列に変更 - スペースも含めて削除する場合は、スペースもパターンに含める
-
注意点
- 実行前に必ずバックアップを取ることをお勧めします
- パスに特殊文字(スペース、角括弧など)が含まれる場合は、必ずダブルクォートで囲む
- テスト用の小さなディレクトリで動作確認してから本番環境で使用する
- ファイルシステムの権限設定により、一部のファイルがリネームできない場合があります
まとめ
このシェルスクリプトを使用することで、多数のファイルの名前を安全かつ効率的に一括変更することができます。特に、クラウドストレージやバージョン管理システムを使用している場合に発生する、不要な文字列の削除に役立ちます。
スクリプトは実行前に変更対象を表示し、確認を求めるため、安全に使用することができます。また、必要に応じてパターンを変更することで、様々なケースに対応できます。