Cor*_*Xii 4 file-management windows-xp
我有两个目录,这样该目录B是至少一个完整的镜子A。例如:
A/
directory1/
file1
directory2/
file2
file3
B/
directory1/
file1
directory2/
file2
directory3/
file4
file3
file5
Run Code Online (Sandbox Code Playgroud)
请注意,B包含存在于 中的所有文件A,以及潜在的其他文件。
我需要的是删除所有文件和目录B不存在A。在上面的例子中,directory3,file4和file5将被删除,这样操作后B是一个完整的镜像,A没有其他文件:
B/
directory1/
file1
directory2/
file2
file3
Run Code Online (Sandbox Code Playgroud)
对于 Windows XP。
使用批处理脚本来做到这一点并非不可能。但是,简单的方法是使用RoboCopy. 不幸的是,这仅包含在 Vista 及更高版本中,但 XP 用户可以安装此资源工具包或在其他地方获取独立副本。
robocopy <source> <destination> /mir
Run Code Online (Sandbox Code Playgroud)
来自帮助 ( robocopy /?):
/E :: copy subdirectories, including Empty ones.
/PURGE :: delete dest files/dirs that no longer exist in source.
/MIR :: MIRror a directory tree (equivalent to /E plus /PURGE).
Run Code Online (Sandbox Code Playgroud)
不幸的是,如果您无法运行外部可执行文件,则需要一个批处理脚本。
编辑:
为了完整起见,我编写了那个批处理脚本。只要确保在安全的地方测试拳头,尽管它似乎有效。您可能想要删除(或评论,rem在前面夹一个)del和rmdir行以进行测试。
@echo off
setlocal EnableDelayedExpansion
set dirsrc=%~f1
set dirdest=%~f2
echo Source: "%dirsrc%"
echo Destination: "%dirdest%"
echo.
echo.
echo Cleaning files...
for /f "tokens=*" %%a in ('dir /s /b /a:-d "%dirdest%"') do (
set curdest=%%a
set cursrc=!curdest:%dirdest%=%dirsrc%!
if not exist !cursrc! (
echo Deleting "!curdest!"
del "!curdest!"
)
)
echo.
echo.
echo Cleaning directories...
set NLM=^
set NL=^^^%NLM%%NLM%^%NLM%%NLM%
rem Two lines left empty for NewLine to work
for /f "tokens=*" %%a in ('dir /s /b /a:d "%dirdest%"') do (
set curdest=%%a
set cursrc=!curdest:%dirdest%=%dirsrc%!
if not exist !cursrc! (
set rmlist=!curdest!?!rmlist!
)
)
set rmlist=!rmlist:?=%NL%!
for /f "tokens=*" %%a in ("!rmlist!") do (
if exist %%a (
echo Removing directory "%%a"
rmdir "%%a"
)
)
endlocal
Run Code Online (Sandbox Code Playgroud)
使用方法很简单:另存为.bat文件(如purge.bat),并调用它像这样:purge source destination。如果源路径或目标路径中有空格,则必须像任何其他命令行...命令一样添加引号。
我将简要说明。
首先,删除文件。它运行一个字符串替换,用源路径替换目标路径,因此它可以检查文件是否存在于源中。这使我可以报告正在删除哪些文件,并且当我开始删除目录时,可以保证它们是空的文件。这让我避免了 . 的丑陋rmdir /s,它删除了所有子目录和文件,就像rm -r在 Linux 中一样。此外,仅通过批处理路径来区分文件和目录是相当混乱的。
当我要删除目录时,我会以相反的顺序构建一个包含所有目录路径的字符串。这是因为最深的级别首先被移除,因为dir /s总是最后提供最深的级别。但是,它可能会按逆字母顺序排列。
另外,感谢 bash 脚本 Eroen,但我看不懂 bash ;)
| 归档时间: |
|
| 查看次数: |
3584 次 |
| 最近记录: |