Board logo

标题: [文件操作] 多级目录下的目录按要求加深,如何用批处 理实现? [打印本页]

作者: kmustwxw    时间: 2015-1-7 11:52     标题: 多级目录下的目录按要求加深,如何用批处 理实现?

本帖最后由 kmustwxw 于 2015-1-7 11:58 编辑

现有大量文件夹要处理,问题描述如下:我用目录树来描述我的问题,要处理的目录结构为:
005
├─005001
│  ├─JA00001
│  │  ├─用处1
│  │  ├─用处2
│  │  ├─用处3
│  │  └─用处4
│  ├─JA00002
│  │  ├─用处1
│  │  ├─用处2
│  │  ├─用处3
│  │  └─用处4
│  ├─JA00003
│  │  ├─用处1
│  │  ├─用处2
│  │  ├─用处3
│  │  └─用处4
还有好多这样的文件夹,能说明问题就不列了,要达到的效果为:
005
├─005001
│      │
│      ├─JA00001
│      │  └─JA00001
│      │      ├─用处1
│      │      ├─用处2
│      │      ├─用处3
│      │      └─用处4
│      ├─JA00002
│      │  └─JA00002
│      │      ├─用处1
│      │      ├─用处2
│      │      ├─用处3
│      │      └─用处4
│      ├─JA00003
│      │  └─JA00003
│      │      ├─用处1
│      │      ├─用处2
│      │      ├─用处3
│      │      └─用处4
就是要在  最里面的目录  的上级目录  加一级目录,
1、按上面的要求,代码如何实现?
2、在 要达到的效果 的目录树中的红色的目录名,如何统一改为:“文件表格” 。这个要求代码如何实现?
说明:005文件夹,是我任意选的一个,还有许多和005一样文件夹结构的文件夹,比如 :001  002  003  004  006 等等。不知道我的表述是不是清楚?,先谢谢了。   
补充说明:第一个要求用一段代码实现,第二个要求用另一段代码实现,两个是各自独立的,不要一段代码实现两个功能。谢谢。有空的兄弟帮忙看下。
作者: pcl_test    时间: 2015-1-7 13:39

本帖最后由 pcl_test 于 2015-1-7 13:44 编辑

回复 1# kmustwxw

假设005所在目录为
E:\test
一、
  1. @echo off
  2. set "lj=E:\test"
  3. for /f "delims=" %%a in ('dir /ad/b "%lj%\"') do (
  4. for /f "delims=" %%b in ('dir /ad/b "%lj%\%%a\"') do (
  5. for /f "delims=" %%c in ('dir /ad/b "%lj%\%%a\%%b\"') do (
  6. md "%lj%\%%a\%%b\%%ctemp\"
  7. move "%lj%\%%a\%%b\%%c" "%lj%\%%a\%%b\%%ctemp\"
  8. ren "%lj%\%%a\%%b\%%ctemp\" "%%c"
  9. )
  10. )
  11. )
  12. pause
复制代码
二、
  1. @echo off
  2. set "lj=E:\test"
  3. for /f "delims=" %%a in ('dir /ad/b "%lj%\"') do (
  4. for /f "delims=" %%b in ('dir /ad/b "%lj%\%%a\"') do (
  5. for /f "delims=" %%c in ('dir /ad/b "%lj%\%%a\%%b\"') do (
  6. for /f "delims=" %%d in ('dir /ad/b "%lj%\%%a\%%b\%%c\"') do (
  7. ren "%lj%\%%a\%%b\%%c\%%d\" "文件表格"
  8. )
  9. )
  10. )
  11. )
  12. pause
复制代码

作者: apang    时间: 2015-1-7 15:15

1.
  1. @set @n=0;/* & echo off
  2. pushd "D:\Test\"
  3. set J=cscript -nologo -e:jscript "%~0"
  4. for /f "delims=" %%a in ('dir /ad/b/s ^| %J%') do (
  5.         for %%b in ("%%a..") do (
  6.                 md "%%a..\%%~nxb"
  7.                 move "%%a." "%%a..\%%~nxb\"
  8.         )
  9. ) 2>nul
  10. pause & exit/b & rem */
  11. s = WScript.StdIn.ReadAll();
  12. ar = s.replace(/\r\n/g, "\\$&").split("\r\n");
  13. ar.sort();
  14. for (i=ar.length; i--;) {
  15.         if (ar[i].indexOf(ar[i-1]) >= 0) ar.splice(i-1, 1);
  16. }
  17. WScript.Echo(ar.join("\n"))
复制代码
2.
  1. @set @n=0;/* & echo off
  2. pushd "D:\Test\"
  3. set J=cscript -nologo -e:jscript "%~0"
  4. for /f "delims=" %%a in ('dir /ad/b/s ^| %J%') do (
  5.         md "%%a..\文件表格"
  6.         move "%%a." "%%a..\文件表格\"
  7. ) 2>nul
  8. pause & exit/b & rem */
  9. s = WScript.StdIn.ReadAll();
  10. ar = s.replace(/\r\n/g, "\\$&").split("\r\n");
  11. ar.sort();
  12. for (i=ar.length; i--;) {
  13.         if (ar[i].indexOf(ar[i-1]) >= 0) ar.splice(i-1, 1);
  14. }
  15. WScript.Echo(ar.join("\n"))
复制代码

作者: apang    时间: 2015-1-8 11:18

假设 005 文件夹位于 D:\Test目录下,在 005 文件夹的第三层下面创建新文件夹:
  1. @echo off
  2. set "sPath=D:\Test"
  3. set "re=%sPath:\=\\%\\[^\\]*\\[^\\]*\\[^\\]*"
  4. pushd "%sPath%\"
  5. for /f "delims=" %%a in ('dir /ad/b/s^|findstr /irx "%re%"') do (
  6.         pushd "%%a\"
  7.         md "%%~nxa" 2>nul
  8.         for /f "delims=" %%b in ('dir /ad /b') do (
  9.                 if /i "%%b" NEQ "%%~nxa" (
  10.                         move "%%b" "%%~nxa\"
  11.                 )
  12.         )
  13.         popd
  14. )
  15. pause
复制代码

作者: kmustwxw    时间: 2015-1-8 11:40

回复 4# apang 首先感谢大家无私的帮助,谢谢你们!
apang你后面写的代码能完美解决问题,精简!(前面的也能)有部分看的不太懂,虚心向你们学习,能帮我rem一下这段的意思吗?  set "re=%sPath:\=\\%\\[^\\]*\\[^\\]*\\[^\\]*"    我看过你写的好多代码都会先用  set  在开头设置一段,就是我水平有限,看不懂,真心希望解释下。谢谢。
作者: apang    时间: 2015-1-8 16:31

回复 5# kmustwxw


    斜杠(\)字符在findstr正则表达式中属于特殊字符,起转义其它字符的作用,要匹配“\”本身,需要用“\\”表示
[^\\] 表示非“\”字符的集合
[^\\]* 表示任意个数的非“\”字符
\\[^\\]* 一个路径字符,后面跟任意个数的非路径字符,刚好可以匹配一级目录

以下用4种颜色对比匹配项,应该可以明白:

%sPath:\=\\%\\[^\\]*\\[^\\]*\\[^\\]*

匹配的路径字串 D:\test\005\005001\JA00001

加上表示限定的参数 /irx 后,能匹配005目录下面的第3层,多于或少于3层将匹配不到。
作者: kmustwxw    时间: 2015-1-9 09:24

回复 6# apang 讲解的很详细,完全彻底的明白了,你用颜色表达的这个,让人一目了然,能把复杂的东西说的简单,深入浅出的讲解问题,也是一种特别好的能力。谢谢 。




欢迎光临 批处理之家 (http://www.bathome.net/) Powered by Discuz! 7.2