标题: [文本处理] 如何比较两个文件夹中文件的大小,并挑出不相同的文件? [打印本页]
作者: pan528 时间: 2014-8-20 16:21 标题: 如何比较两个文件夹中文件的大小,并挑出不相同的文件?
本帖最后由 pan528 于 2014-8-20 17:24 编辑
如何比较两个文件夹中文件的大小,并挑出不相同的文件?
一、材料
有两个文件夹,其中的文件大多数内容是相同的,因此,相同的文件,他们的大小也是一致的,只是文件名不同。
二、要求
挑出不相同的文件。
试了一下,这种方法可以达到效果:
比较a目录与b目录中的文件,将a目录中与b目录相同大小的文件放到c目录中。c目录的文件就是不同大小的文件。
但不能直接挑出相同者。有更好的方法吗?请高手指点。- @echo off
-
- echo 正在操作 ...
- if not exist c md c
- FOR /F "usebackq delims=" %%a in (`dir /o:s /s /b a\`) do (
- FOR /F "usebackq delims=" %%b in (`dir /o:s /s /b b\`) do (
- if %%~za == %%~zb move /y "a\%%~nxa" c\
- ))
- pause
- goto:eof
复制代码
作者: CrLf 时间: 2014-8-20 18:11
这个用 hash 来判断再合适不过了:http://bbs.bathome.net/thread-30609-1-1.html- @echo off
- for /f "tokens=1* delims=|" %%a in ('hash /s /crc32 /printf:"%%s|%%s" a\') do set "HASH[%%a]=%%b"
- for /f "tokens=1* delims=|" %%a in ('hash /s /crc32 /printf:"%%s|%%s" b\') do (
- set "file=%%b"
- if defined HASH[%%a] (
- setlocal enabledelayedexpansion
- echo !HASH[%%a]! 与 !file! 是重复文件
- endlocal
- )
- )
复制代码
作者: pan528 时间: 2014-8-20 20:51
回复 2# CrLf
通过了测试!谢谢!
但如果要挑出不同的文件该怎么写?
作者: CrLf 时间: 2014-8-20 21:06
本帖最后由 CrLf 于 2014-8-22 15:54 编辑
回复 3# pan528
move 操作不可逆,请先用少量样本测试:- @echo off
- for /f "tokens=1* delims=|" %%a in ('hash /s /crc32 /printf:"%%s|%%s\n" a\') do set "HASH[%%a]=%%b"
- for /f "tokens=1* delims=|" %%a in ('hash /s /crc32 /printf:"%%s|%%s\n" b\') do (
- set "file=%%b"
- if defined HASH[%%a] (
- setlocal enabledelayedexpansion
- move /y "!HASH[%%a]!" c\ 2>nul
- move /y "!file!" c\
- endlocal
- )
- )
复制代码
作者: pan528 时间: 2014-8-21 08:18
本帖最后由 pan528 于 2014-8-22 07:33 编辑
回复 4# CrLf
不知问题在哪里,没有通过测试。
另外,这种方法效率上有点低,不如不用第三方软件,直接写DOS代码运行快。
不好意思,我前面的例子标注错了。应该是:
“比较a目录与b目录中的文件后,将a目录中与b目录相同大小的文件放到c目录中。c目录的文件就是相同大小的文件。只是不能直接挑出不相同者。”
而原来的a目录剩下的就是“不相同者”。但不能直接挑出!这样的结果就是导致原目录的改变。
我用“if %%~za == %%~zb move /y "a\%%~nxa" c\”移出相同者,但不能用:
“if not %%~za == %%~zb move /y "a\%%~nxa" c\”移出不相同者,我想求的是直接移出不相同者的方法。当然其他思路也可以。但不能改变原存放目录,因为原目录中的文件量很大,操作效率也是要考虑的一个重要因素。
谢谢你的回贴,你给了我不少启发。如:
按二楼的思路,直接比较相同,可写成:- @echo off
-
- echo 正在操作 ...
- FOR /F "usebackq delims=" %%a in (`dir /o:s /s /b a\`) do (
- FOR /F "usebackq delims=" %%b in (`dir /o:s /s /b b\`) do (
- if %%~za == %%~zb echo %%~nxa 与 %%~nxb 相同!
- ))>>相同文件.txt
复制代码
作者: CrLf 时间: 2014-8-22 16:01
4楼代码漏了一个 \n,已修改
计算 hash 需要逐字节读文本,肯定要比比较文件大小慢,但是不容易误判
非要用文件大小作为依据的话,就是这样,实际使用前请用样本测试:- @echo off
- echo 正在操作 ...
- FOR /F "delims=" %%a in ('dir /s /b a\') do set "SIZE[%%~za]=%%f"
- FOR /F "delims=" %%b in ('dir /s /b b\') do (
- if defined #%%~zb (
- set "file=%%~fb"
- setlocal enabledelayedexpansion
- move /y "!SIZE[%%~za]!" c\ 2>nul
- move /y "!file!" c\
- endlocal
- )
- )
复制代码
欢迎光临 批处理之家 (http://www.bathome.net/) |
Powered by Discuz! 7.2 |