我需要保留檔案副檔名,並且需要透過子資料夾進行工作。
例如:“File.name.ext”應變為“File-name.ext”
我對 shell 腳本一無所知,所以請在您的回覆中詳細說明。我不知道任何開關意味著什麼,甚至不知道如何指定路徑。
答案1
我實際上完全同意另一個答案。 GUI 批次重命名實用程式是所以使用起來更方便。但是,只是為了好玩,我編寫了以下批次文件,該文件應該遞歸地重命名當前目錄中的所有文件。和子目錄。並替換 .與 - (例如“長.文件。 .name.ext“ 會變成 ”長-文件--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
執行批次檔一次,然後如果輸出看起來令人滿意,則透過刪除單字echo
(第二個實例,而不是第一行)並重新執行檔案來執行實際重新命名。
答案2
我不知何故無法理解為什麼你要費心處理批次檔。為什麼不使用無數 GUI 重新命名工具之一,例如:
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"