ディレクトリ上のすべてのファイルとフォルダを大文字にするにはどうすればいいですか?

ディレクトリ上のすべてのファイルとフォルダを大文字にするにはどうすればいいですか?

フォルダ内のすべてのフォルダとファイルの名前を大文字に変更するにはどうすればよいですか? (サブフォルダでも可能であれば)

このコードはありますが、フォルダーではなくファイルのみが変換されます。

@echo off
setlocal enableDelayedExpansion

pushd %currentfolder%

for %%f in (*) do (
   set "filename=%%~f"

   for %%A in (A B C D E F G H I J K L M N O P Q R S T U V W X Y Z) do (
      set "filename=!filename:%%A=%%A!"
   )
   ren "%%f" "!filename!" >nul 2>&1
)
endlocal

答え1

非再帰的なソリューション。

わかりませんのでcmd.exe、スクリプトを修正することはできませんが、Python がインストールされている場合は、このスクリプトを使用できます (すべての OS で動作するはずです)。

import os

files = os.listdir('.')
for f in files:
    newname = f.upper()
    if newname == f:
        continue
    if newname in files:
        print( "error: %s already exists" % newname )
    os.rename(f, newname)

名前を付けて保存しupcase_files_folders.pypython upcase_files_folders.py名前を変更したいファイルがあるディレクトリで実行するだけです。


更新: 再帰的なソリューション。

申し訳ありませんが、再帰的なソリューションが求められていることに気付きました。

次のスクリプトはサブディレクトリ ツリーをたどり、名前を変更するファイルとサブディレクトリをスタックに記録します。次に、スタックからファイル/サブディレクトリを 1 つずつポップし、大文字に変換します。

(トラバーサルの途中でディレクトリの名前を変更するのを避けるには、2 段階のソリューションが最適です。一度にすべてを実行しようとすると、エラーが発生しやすくなり、不安定になります。)

また、誤ってスクリプトを実行した場合に備えて、変更のログを保存しておくことをお勧めします。このスクリプトは、すべての名前変更を記録します.upcase_files_folders.log

from __future__ import print_function
import os

with open('.upcase_files_folders.log','a') as logfile:
    renames = []
    for d, subdirs, fs in os.walk(os.getcwd()):
        for x in fs + subdirs:
            oldname = os.path.join(d, x)
            newname = os.path.join(d, x.upper())
            if x == '.upcase_files_folders.log' or newname == oldname:
                continue
    for (oldname, newname) in reversed(renames):
        os.rename(oldname, newname)
        print( "renamed:  %s  -->  %s" % (repr(oldname), repr(newname)), file = logfile )

関連情報