1. ホーム
  2. linux

[解決済み】Linuxですべてのフォルダとファイルの名前を小文字に変更するにはどうすればいいですか?

2022-04-08 18:04:13

質問

フォルダツリー全体の名前を再帰的に変更し、どこにも大文字が現れないようにしなければなりません(C++のソースコードですが、それは重要ではないはずです)。

CVSやSubversionのバージョン管理ファイル/フォルダーを無視するとボーナスポイントがあります。シェルはどのLinuxボックスでも利用できるはずなので、望ましい方法はシェルスクリプトでしょう。

ファイル名の変更の詳細については、いくつかの有効な議論がありました。

  1. 同じ小文字の名前のファイルは上書きされるべきだと思う。それはユーザーの問題だ。大文字小文字を無視するファイルシステムでチェックアウトした場合、最初のものを後者で上書きすることもあるでしょう。

  2. 私ならA-Z文字を考慮してa-zに変換します。それ以外は(少なくともソースコードでは)問題を呼び起こすだけです。

  3. このスクリプトはLinuxシステム上でビルドを実行するために必要なものなので、CVSやSubversionのバージョン管理ファイルの変更は省略されるべきだと思います。結局のところ、それはスクラッチチェックアウトに過ぎないのです。多分、"export"がより適切でしょう。

解決方法は?

を使用した簡潔なバージョンです。 "rename" コマンドを使用します。

find my_root_dir -depth -exec rename 's/(.*)\/([^\/]*)/$1\/\L$2/' {} \;

これにより、ディレクトリがファイルより先にリネームされる問題や、ファイルを存在しないディレクトリに移動させようとする問題を回避できます (例 "A/A""a/a" ).

を使用しない、より冗長なバージョンもあります。 "rename" .

for SRC in `find my_root_dir -depth`
do
    DST=`dirname "${SRC}"`/`basename "${SRC}" | tr '[A-Z]' '[a-z]'`
    if [ "${SRC}" != "${DST}" ]
    then
        [ ! -e "${DST}" ] && mv -T "${SRC}" "${DST}" || echo "${SRC} was not renamed"
    fi
done

追伸

後者では、moveコマンドをより柔軟に使うことができます(例えば。 "svn mv" ).