1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Macのターミナルを使って、サブフォルダ内を含むファイル名を一括リネームする方法

Last updated at Posted at 2025-02-18

クラウドストレージやバージョン管理システムを使用していると、ファイル名に自動的に追加される文字列(例:[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 "処理が完了しました"

使用方法

  1. スクリプトの保存

    • 上記のスクリプトを任意の場所(例:rename_script.sh)に保存します。
    • ファイル名に日本語やスペースが含まれていない方が安全です。
  2. 実行権限の付与

    chmod +x "/path/to/rename_script.sh"
    
    • パスに角括弧([])やスペースが含まれる場合は、必ずダブルクォート(")で囲みます。
  3. スクリプトの実行

    "/path/to/rename_script.sh" "/path/to/target/directory"
    
    • 対象とするディレクトリのパスを指定して実行します。
    • スクリプトは実行前に変更対象のファイル一覧を表示し、確認を求めます。

スクリプトの動作説明

  1. 引数チェック

    • ディレクトリパスが指定されているか確認
    • 指定されたディレクトリが存在するか確認
  2. 対象ファイルの検索

    • findコマンドで指定パターンに一致するファイルを検索
    • サブフォルダも含めて再帰的に検索
  3. 確認プロンプト

    • 変更対象のファイル一覧を表示
    • ユーザーに確認を求める(y/nで回答)
  4. リネーム処理

    • sedコマンドでファイル名から指定パターンを削除
    • mvコマンドで実際のリネームを実行
    • 各ファイルの処理結果を表示

カスタマイズ方法

異なるパターンのファイル名を変更したい場合は、以下の2箇所を編集します:

  1. findコマンドの検索パターン

    find "$1" -type f -name '*[conflicted]*'
    
    • *[conflicted]*の部分を目的のパターンに変更
  2. パラメータ展開の置換パターン

    newname="${file//" [conflicted]"}"
    
    • [conflicted]の部分を削除したい文字列に変更
    • スペースも含めて削除する場合は、スペースもパターンに含める

注意点

  • 実行前に必ずバックアップを取ることをお勧めします
  • パスに特殊文字(スペース、角括弧など)が含まれる場合は、必ずダブルクォートで囲む
  • テスト用の小さなディレクトリで動作確認してから本番環境で使用する
  • ファイルシステムの権限設定により、一部のファイルがリネームできない場合があります

まとめ

このシェルスクリプトを使用することで、多数のファイルの名前を安全かつ効率的に一括変更することができます。特に、クラウドストレージやバージョン管理システムを使用している場合に発生する、不要な文字列の削除に役立ちます。

スクリプトは実行前に変更対象を表示し、確認を求めるため、安全に使用することができます。また、必要に応じてパターンを変更することで、様々なケースに対応できます。

1
0
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?