中国DOS联盟

-- 联合DOS 推动DOS 发展DOS --

联盟域名:www.cn-dos.net 论坛域名:www.cn-dos.net/forum
DOS,代表着自由开放与发展,我们努力起来,学习FreeDOS和Linux的自由开放与GNU精神,共同创造和发展美好的自由与GNU GPL世界吧!

中国DOS联盟论坛
现在时间是 2026-08-06 18:50
中国DOS联盟论坛 » DOS批处理 & 脚本技术(批处理室) » 求-改文件名并替换文本内容(多文件,多级文件夹) 查看 1,275 回复 8
楼 主 求-改文件名并替换文本内容(多文件,多级文件夹) 发表于 2007-10-18 11:22 ·  中国 广东 深圳 福田区 电信
新手上路
积分 12
发帖 4
注册 2007-09-15 16:09
18年会员
UID 97462
性别 男
状态 离线
最近在整理文章时碰到一个难题:

前因:
1. 主文件夹 html 下有很多文件以及很多下级文件夹,文件名形式为"aa.php" 或 "aa.bb.php"
------------------
2. 文件内容中包含有文件名(例:aa.php 中有内容为"aa.bb.php")
============
需求:
把 html 以及下级(包括下下级)文件夹中的所有文件名
aa.bb.php --> aa_bb.php
aa.cc.php --> aa_cc.php
xx.xx.php --> xx_xx.php
(也就是说把第一的点替换为 _ )
aa.php (这样的就不用改名)
-----------------
把 html 以及下级(包括下下级)文件夹中的所有文件内容包含
例如 aa.php 内容包含 "aa.bb.php" ---> "aa_bb.php"
============
思路:
1.改名:
先把所有文件名包含两个点的生成一个文件 "name1.txt" (不知道怎么判断文件名是一个点还是两个点)
把所有文件名中的 ".php" 先改成 "-php"
然后再把文件名中的 " . " 改成 " _ "
再把 "-php" 改成 " .php"
****不知这样才能自动循环所有下级文件夹****
---------------------------
2.替换文件内容:
"name1.txt" copy 一个为 "name2.txt",替换一个点 " . " " _ " (就是 aa.bb.php --> aa_bb.php) (还好这个比较简单,可以 "aa.bb.php" --> "aa.bb-php" --> "aa_bb-php" --> "aa_bb.php")
替换文件内容 "aa.bb.php" --> "aa_bb.php" 不知道这样成立不 :
for /f "delims=" %%a in ('dir/b *.php') do (
for /f %%b in (name1.txt) do (
for /f %%c in (name2.txt) do (
sed "s/%%b/%%c/g" %%a
)))
**//想法是抽取 name2.txt 和 name1.txt 来对应文件内容
****另,不知道怎样能循环所有下级文件夹*****
================

请各位多多指教
谢谢!

[ Last edited by feelnow on 2007-10-18 at 11:24 AM ]
2 发表于 2007-10-18 15:18 ·  中国 上海 松江区 电信
铂金会员
★★★★
DOS一根葱
积分 5,493
发帖 2,315
注册 2006-05-01 10:41
20年会员
UID 54766
性别 男
来自 上海
状态 离线
@echo off
del *.tmp 2>nul
for /f "delims=*" %%i in ('dir /ad /b') do dir /s /a-d /b /x %%i\*.php>>ren_1.tmp
for /f "delims=*" %%i in (ren_1.tmp) do echo %%~dpni>>ren_2.tmp
setlocal enabledelayedexpansion
cd.>ren.php_php.cmd
for /f "tokens=*" %%i in (ren_2.tmp) do (
set var=%%i
set "var=!var:.=_!"
>>ren.php_php.cmd echo move /y %%i.php !var!.php
)
pause

查看ren.php_php.cmd 是否达到要求:
把 html 以及下级(包括下下级)文件夹中的所有文件名(也就是说不包括当前目录?)
aa.bb.php --> aa_bb.php
aa.cc.php --> aa_cc.php
xx.xx.php --> xx_xx.php(也就是说把第一的点替换为 _ )
aa.php (这样的就不用改名)

[ Last edited by fastslz on 2007-10-18 at 05:05 PM ]
第一高手 第二高手

3 发表于 2007-10-18 15:32 ·  中国 上海 松江区 电信
铂金会员
★★★★
DOS一根葱
积分 5,493
发帖 2,315
注册 2006-05-01 10:41
20年会员
UID 54766
性别 男
来自 上海
状态 离线
哦忽略了可能包括空格的文件名
把>>ren.php_php.cmd echo move /y %%i.php !var!.php
改成>>ren.php_php.cmd echo move /y "%%i.php" "!var!.php"
你的第2点要求你会用sed就用相应的参数改吧

[ Last edited by fastslz on 2007-10-18 at 05:06 PM ]
第一高手 第二高手

4 发表于 2007-10-18 17:05 ·  中国 湖南 娄底 电信
银牌会员
★★★
积分 2,268
发帖 879
注册 2006-12-19 16:23
19年会员
UID 73968
性别 男
状态 离线
当文件名是 aa.php 时
无法判断内容是否包含 "aa.bb.php"
只有当文件名是aa.bb.php时,才能判断.
其它的都好办,
致精致简!
5 发表于 2007-10-18 21:34 ·  中国 上海 松江区 电信
铂金会员
★★★★
DOS一根葱
积分 5,493
发帖 2,315
注册 2006-05-01 10:41
20年会员
UID 54766
性别 男
来自 上海
状态 离线
@echo off
del *.tmp 2>nul
for /f "delims=*" %%i in ('dir /ad /b') do dir /s /a-d /b /x %%i\*.php>>ren_1.tmp
for /f "delims=*" %%i in (ren_1.tmp) do echo %%~dpni>>ren_2.tmp
setlocal enabledelayedexpansion
cd.>ren.php_php.cmd
for /f "tokens=*" %%i in (ren_2.tmp) do (
set var=%%i
set "var=!var:.=_!"
>>ren.php_php.cmd echo move /y "%%i.php" "!var!.php"
)
del *.tmp 2>nul
call ren.php_php.cmd
for /f "delims=*" %%i in ('dir /ad /b') do dir /s /a-d /b /x %%i\*_*.php>>replace_1.tmp
for /f "delims=*" %%i in (replace_1.tmp) do echo %%~dpni>>replace_2.tmp
cd.>replace.php_php.cmd
for /f "tokens=*" %%i in (replace_2.tmp) do (
set var=%%~ni
set "var=!var:_=.!"
>>replace.php_php.cmd echo sed.exe "s/!var!/%%~ni/g" "%%i.php"^>"%%i.php.new"
)
call replace.php_php.cmd

for /f "tokens=*" %%i in (replace_1.tmp) do (
del %%i
move /y %%i.new %%i
)
del *.tmp 2>nul
pause


2个要求应该达到吗
第一高手 第二高手

6 发表于 2007-11-05 17:51 ·  中国 天津 河西区 联通
新手上路
积分 11
发帖 6
注册 2007-08-29 10:31
18年会员
UID 96084
性别 男
状态 离线
我也下一个试试。。。。。。。。。。。。。。
7 发表于 2007-11-06 01:36 ·  中国 广东 深圳 福田区 电信
新手上路
积分 8
发帖 4
注册 2007-10-18 19:24
18年会员
UID 100090
性别 男
状态 离线
我还不能下哦!!
8 发表于 2007-11-06 19:24 ·  中国 江苏 常州 电信
银牌会员
★★★
积分 2,404
发帖 946
注册 2005-09-08 13:44
20年会员
UID 42345
状态 离线
学习一个 不用SED

@echo off
setlocal enabledelayedexpansion
for /r %%i in (*.php) do (
set var=%%~ni
set var=!var:.=_!
for /f "delims=*" %%a in (%%~fi) do (
set list=%%~na
set list=!list:.=_!
echo !list!.php>>"%%~dpi!var!.newphp"
)
del "%%~fi"
)
for /r %%i in (*.newphp) do (
ren "%%~fi" "%%~ni.php"
)
pause

把前面的 "%%~fi" “”去了

[ Last edited by terse on 2007-11-6 at 08:56 PM ]
简单!简单!再简单!
9 发表于 2007-12-02 01:09 ·  中国 广东 电信
新手上路
积分 12
发帖 4
注册 2007-09-15 16:09
18年会员
UID 97462
性别 男
状态 离线
感谢"fastslz"和"terse" 的大力支持,
由于近来有些杂事没能脱身,没上来做答复结贴,实在抱歉,
按第 5/8 楼 的代码,已经能达到我的想法,
再次感谢!
论坛跳转: