中国DOS联盟论坛

中国DOS联盟

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

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

游客:  注册 | 登录 | 命令行 | 会员 | 搜索 | 上传 | 帮助 »
中国DOS联盟论坛 » DOS批处理 & 脚本技术(批处理室) » 求-改文件名并替换文本内容(多文件,多级文件夹)
作者:
标题: 求-改文件名并替换文本内容(多文件,多级文件夹) 上一主题 | 下一主题
feelnow
新手上路





积分 12
发帖 4
注册 2007-9-15
状态 离线
『楼 主』:  求-改文件名并替换文本内容(多文件,多级文件夹)

最近在整理文章时碰到一个难题:

前因:
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 ]



http://www.hostany.cn 国际主机在线
2007-10-18 11:22
查看资料  访问主页  发短消息 网志   编辑帖子  回复  引用回复
fastslz
铂金会员

DOS一根葱


积分 5493
发帖 2315
注册 2006-5-1
来自 上海
状态 离线
『第 2 楼』:  


@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 ]



第一高手    第二高手

2007-10-18 15:18
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
fastslz
铂金会员

DOS一根葱


积分 5493
发帖 2315
注册 2006-5-1
来自 上海
状态 离线
『第 3 楼』:  

哦忽略了可能包括空格的文件名
把>>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 ]



第一高手    第二高手

2007-10-18 15:32
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
26933062
银牌会员





积分 2268
发帖 879
注册 2006-12-19
状态 离线
『第 4 楼』:  

当文件名是 aa.php 时
无法判断内容是否包含 "aa.bb.php"
只有当文件名是aa.bb.php时,才能判断.
其它的都好办,



致精致简!
2007-10-18 17:05
查看资料  发短消息 网志   编辑帖子  回复  引用回复
fastslz
铂金会员

DOS一根葱


积分 5493
发帖 2315
注册 2006-5-1
来自 上海
状态 离线
『第 5 楼』:  


@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个要求应该达到吗



第一高手    第二高手

2007-10-18 21:34
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
tjdai
新手上路





积分 11
发帖 6
注册 2007-8-29
状态 离线
『第 6 楼』:  

我也下一个试试。。。。。。。。。。。。。。

2007-11-5 17:51
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
love3398
新手上路





积分 8
发帖 4
注册 2007-10-18
状态 离线
『第 7 楼』:  

我还不能下哦!!

2007-11-6 01:36
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
terse
银牌会员





积分 2404
发帖 946
注册 2005-9-8
状态 离线
『第 8 楼』:  

学习一个 不用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 ]



简单!简单!再简单!
2007-11-6 19:24
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
feelnow
新手上路





积分 12
发帖 4
注册 2007-9-15
状态 离线
『第 9 楼』:  

感谢"fastslz"和"terse" 的大力支持,
由于近来有些杂事没能脱身,没上来做答复结贴,实在抱歉,
按第 5/8 楼 的代码,已经能达到我的想法,
再次感谢!



http://www.hostany.cn 国际主机在线
2007-12-2 01:09
查看资料  访问主页  发短消息 网志   编辑帖子  回复  引用回复

请注意:您目前尚未注册或登录,请您注册登录以使用论坛的各项功能,例如发表和回复帖子等。


可打印版本 | 推荐给朋友 | 订阅主题 | 收藏主题



论坛跳转: