ファイル拡張子を保持し、サブフォルダーを通じて動作する必要があります。
たとえば、「File.name.ext」は「File-name.ext」になります。
私はシェル スクリプトについて全く無知なので、回答では詳しく説明してください。スイッチの意味がまったくわかりませんし、パスの指定方法さえもわかりません。
答え1
私は他の回答に完全に同意します。GUIの大量リネームユーティリティはそれではるかに使いやすくなりました。しかし、楽しみのために、現在のディレクトリとサブディレクトリ内のすべてのファイルの名前を再帰的に変更し、. を - に置き換える次のバッチファイルを作成しました(たとえば、「長い .file. .name.ext" となります "長い -file- -name.ext"):
@echo off
setlocal enabledelayedexpansion
for /r %%f in (*.*) do (
set fn=%%~nf
REM Remove the echo from the following line to perform the actual renaming!
if not [!fn!]==[] if not ["%%~nxf"]==["!fn:.=-!%%~xf"] echo ren "%%~f" "!fn:.=-!%%~xf"
)
pause
バッチ ファイルを 1 回実行し、出力が適切であると思われる場合は、単語echo
(最初の行ではなく 2 番目のインスタンス) を削除してファイルを再実行し、実際の名前変更を実行します。
答え2
では、なぜわざわざバッチ ファイルを使う必要があるのか、私には理解できません。次のような無数の GUI 名前変更ツールの 1 つを使ってみてはいかがでしょうか。
http://www.beroux.com/english/softwares/renameit/
もしそれが気に入らないなら、このパレードをチェックしてください:
http://www.techsupportalert.com/best-free-rename-utility.htm
答え3
これは、あなたが望むことができるバッチファイルの最終版です。ファイル名や拡張子の有無にかかわらず動作しますが、ファイル名に「」%
または!
「」を含むファイルはトラブルを起こす。
遅延拡張を使用するため、遅延拡張をオンにしたコマンドプロンプトから実行する必要があります(単に実行するsetlocal /enabledelayedexpansion
だけでは、遅延拡張がオンになっているだけなので、十分ではありません。すでに有効になっている場合; コマンドプロンプトの実行時に有効になっていないと効果はありません。
スイッチを使用してコマンド プロンプトを開くことで遅延拡張をオンにできます/V:ON
が、以下のバッチ ファイルのように既存のコマンド プロンプトからオンにすることもできます。
@echo off
:: This batch file (prints the command to) rename files so that
:: any dots (.) are replaced with dashes (-)
::
:: Note, files with names containing percents (%) and exclamantions (!)
:: will intefere with command-prompt syntax and are not supported, but
:: can be worked around: https://stackoverflow.com/questions/5226793/
:: If this batch-file has no parameters...
if [%1]==[] (
:: Open a new command-prompt with delayed-expansion enabled and call self
cmd /v:on /c "%0" +
:: Quit
goto :eof
)
:: Recurse through all files in all subdirectories
for /r %%i in (*) do (
rem (:: cannot be used for comments in a FOR loop)
rem Check if it has an extension
if [%%~xi]==[] (
rem If it has an extension, preserve it
set RENFN=%%~nxi
) else (
rem Copy the path (and filename)
set RENFN=%%~ni
rem Check if it has a filename
if not [%%~ni]==[] (
rem If it has a filename, replace dots with dashes
set RENFN=!RENFN:.=-!
)
)
rem Rename original file
ren "%%i" "!RENFN!%%~xi"
)
:: Exit spawned shell (no need to use setlocal to wipe out the envvar)
exit
:: Test output:
::
:: C:\t> dir /b/a
::
:: .txt
:: blah
:: file.blah.txt
:: foo.bar.txt
:: super duper. .blah.ttt. omergerd.---.mp4
:: t.bat
::
:: C:\t> t.bat
::
:: ren "C:\t\.txt" ".txt"
:: ren "C:\t\blah" "blah"
:: ren "C:\t\file.blah.txt" "file-blah.txt"
:: ren "C:\t\foo.bar.txt" "foo-bar.txt"
:: ren "C:\t\super duper. .blah.ttt. omergerd.---.mp4" "super duper- -blah-ttt- omergerd----.mp4"
:: ren "C:\t\t.bat" "t.bat"