windows batch命令将所有想要的子文件夹递归地移动到目录中的NEW文件夹中

时间:2013-04-11 07:50:01

标签: windows command-line batch-processing

我有一个本地Folder-A,它有许多子文件夹(svn-repository),这些子文件夹都有一个名为.svn的子文件夹。现在我想将所有.svn文件夹移动到Folder-B,但是如果我想将.svn文件夹恢复到原来的位置,那么我可以SVN更新它们,所以“.svn”文件夹的父文件夹信息必须退出夹-B

就像这样开始:

Folder-A
 |_DR1
   |_.svn
   |_s1
      |_.svn
      |_s1_s1folder
        |_.svn
        |_file1
      |_file1  
   |_s2
      |_.svn
      |_file1
      |_file2
 |_DR2 ... etc

所需的移动结果:

Folder-A only have actual sub-folders and data but without .svn folder

Folder-B
 |_DR1
   |_.svn
   |_s1
      |_s1_s1folder
        |_.svn
      |_.svn
   |_s2
      |_.svn
 |_DR2 ... etc

所需的RESTORE结果:

Folder-A&文件夹-B回到我们开始的地方。

请帮助编写命令行来完成MOVE和RESTORE任务,谢谢

1 个答案:

答案 0 :(得分:1)

@ECHO OFF
SETLOCAL
:: establish source and destination directorynames; ensure dest exists
SET source=c:\folder-a
SET dest=u:\folder-b
MD %dest% 2>NUL
:: delete a tempfile if it exists
DEL "%temp%\svntmp2.tmp" 2>nul
:: create a dummy directory
MD c:\dummy
:: go to root of tree containing SVN directories
PUSHD "%source%" 
XCOPY /L /s . c:\dummy |find /i "\svn\" >"%temp%\svntmp1.tmp"
POPD
:: goto destination directory
PUSHD "%dest%"
FOR /f "delims=" %%i IN ('type "%temp%\svntmp1.tmp"') DO CALL :moveit "%%i"
FOR /f "delims=" %%i IN (
 'TYPE "%temp%\svntmp2.tmp"^|sort /r'
 ) DO RD "%%i" /S /Q
POPD

:: delete tempfiles 
del "%temp%\svntmp1.tmp"
del "%temp%\svntmp2.tmp"

:: delete the dummy directory
RD /s /q c:\dummy

GOTO :eof

:moveit
:: get filename, remove quotes, then remove leading '.'
SET sourcefile=%~1
SET sourcefile=%sourcefile:~1%
FOR %%i IN ("%sourcefile%") DO (
MD ".%%~pi" 2>nul
MOVE "%source%%%~i" ".%%~pnxi"
>>"%temp%\svntmp2.tmp" ECHO %source%%%~pi
)

GOTO :eof
  • 设置源目录和目标目录。
  • 制作虚拟空目录
  • 转到您的来源并生成要使用的文件列表 XCOPY/L并过滤包含\svn\
  • 的行
  • 转到目的地目录
  • 移动每个文件
    • 删除前导'。'来自XCOPY输出
    • 创建目标子目录;忽略'它已存在'错误
    • 移动文件
    • 在第二个临时文件中记录目录名称
  • 反向排序第二个tempfile,将最深的子目录放在第一位
  • 删除目录,忽略'它不存在'错误
  • 删除临时文件和虚拟目录。

请注意,实际 DO 移动/目录创建/删除的命令仅为ECHO。这样您就可以验证例程是否符合您的要求。您需要验证它是否正确,然后从语句中删除ECHO关键字以实际激活移动。出于安全考虑,首先对小虚拟区域进行测试。

至于恢复 - 它相对容易。

xcopy /s/e/v "...folder-b\dr1\svn\" "\folder-a\dr1\svn\"

应该做你想做的事情,将恢复的项目文件保存在文件夹-b中(如果你愿意,删除它 - 这是你的系统),你可以逐个项目地恢复。

(我一直使用SVN,因为现在这个点对我来说有点小......)