Board logo

标题: 求-改文件名并替换文本内容(多文件,多级文件夹) [打印本页]

作者: feelnow     时间: 2007-10-18 11:22    标题: 求-改文件名并替换文本内容(多文件,多级文件夹)

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

前因:
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 ]
作者: fastslz     时间: 2007-10-18 15:18

@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 ]
作者: fastslz     时间: 2007-10-18 15:32
哦忽略了可能包括空格的文件名
把>>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 ]
作者: 26933062     时间: 2007-10-18 17:05
当文件名是 aa.php 时
无法判断内容是否包含 "aa.bb.php"
只有当文件名是aa.bb.php时,才能判断.
其它的都好办,
作者: fastslz     时间: 2007-10-18 21:34

@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个要求应该达到吗
作者: tjdai     时间: 2007-11-5 17:51
我也下一个试试。。。。。。。。。。。。。。
作者: love3398     时间: 2007-11-6 01:36
我还不能下哦!!
作者: terse     时间: 2007-11-6 19:24
学习一个 不用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 ]
作者: feelnow     时间: 2007-12-2 01:09
感谢"fastslz"和"terse" 的大力支持,
由于近来有些杂事没能脱身,没上来做答复结贴,实在抱歉,
按第 5/8 楼 的代码,已经能达到我的想法,
再次感谢!