我需要重命名整个文件结构,并找到某个字符串,如“_foo”,并将其重命名为“”。结构将如下: something_foo-> multiples_folders_and_files_foo-> multiples_folders_and_files_foo-> files_foo
每个文件夹中的所有文件和每个文件夹中的每个文件夹不得包含字符串“_foo”。
我在windows下工作。我尝试过powershell脚本,我能够重命名一个文件夹,但不能递归重命名所有文件夹。
谢谢你们!
答案 0 :(得分:0)
@echo off
setlocal
set "string_to_remove=_foo"
set "root_dir=c:\root"
pushd "%root_dir%"
setlocal enableDelayedExpansion
for %%f in (*) do (
set "file_name=%%f"
ren "!file_name!" "!file_name:%string_to_remove%=!"
)
for /r /d %%# in (*) do (
set "dir_name=%%#"
pushd "%%#"
for %%f in (*) do (
set "file_name=%%f"
ren "!file_name!" "!file_name:%string_to_remove%=!"
)
popd
if "!dir_name!" NEQ "!dir_name:%string_to_remove%=!" move "!dir_name!" "!dir_name:%string_to_remove%=!"
)
popd
endlocal
答案 1 :(得分:0)
未经测试但请尝试此操作(在PowerShell中)
PS> ls -rec -path $path | Ren -new { $_.name -replace '_foo' } -passthru
如果工作删除 - passthru
切换
编辑: 如果名称末尾的“_foo”,您可以更改表达式:
| Ren -new { $_.basename -replace '_foo$' } -ea silentlycontinue
编辑:
更强大的代码:(感谢TheMadTechnician)
PS> GCI $path -filter '*_foo*' -rec | Ren -new { $_.name -replace '_foo' } -passthru
答案 2 :(得分:0)
@echo off
setlocal enableextensions disabledelayedexpansion
set "remove=_foo"
for /f "delims=" %%a in ('dir /s /b "*%remove%*.*" 2^>nul ^| sort /r') do (
set "name=%%~nxa"
setlocal enabledelayedexpansion
for %%b in ("!name:%remove%=!") do endlocal & echo ren "%%~fa" "%%~b"
)
这将枚举所有匹配的文件/文件夹,按相反顺序排序(因此文件在包含它们的文件夹之前处理),并为每个文件/文件夹删除指示的字符串
重命名操作仅响应控制台。如果输出正确,请删除echo
命令