Board logo

标题: [文本处理] 如何比较两个文件夹中文件的大小,并挑出不相同的文件? [打印本页]

作者: pan528    时间: 2014-8-20 16:21     标题: 如何比较两个文件夹中文件的大小,并挑出不相同的文件?

本帖最后由 pan528 于 2014-8-20 17:24 编辑

如何比较两个文件夹中文件的大小,并挑出不相同的文件?

一、材料
有两个文件夹,其中的文件大多数内容是相同的,因此,相同的文件,他们的大小也是一致的,只是文件名不同。

二、要求
挑出不相同的文件。


试了一下,这种方法可以达到效果:
比较a目录与b目录中的文件,将a目录中与b目录相同大小的文件放到c目录中。c目录的文件就是不同大小的文件。
但不能直接挑出相同者。有更好的方法吗?请高手指点。
  1. @echo off
  2. echo 正在操作 ...
  3. if not exist c md c
  4. FOR /F "usebackq delims=" %%a in (`dir /o:s /s /b a\`) do (
  5. FOR /F "usebackq delims=" %%b in (`dir /o:s /s /b b\`) do (
  6. if %%~za == %%~zb move /y "a\%%~nxa" c\
  7. ))
  8. pause
  9. goto:eof
复制代码

作者: CrLf    时间: 2014-8-20 18:11

这个用 hash 来判断再合适不过了:http://bbs.bathome.net/thread-30609-1-1.html
  1. @echo off
  2. for /f "tokens=1* delims=|" %%a in ('hash /s /crc32 /printf:"%%s|%%s" a\') do set "HASH[%%a]=%%b"
  3. for /f "tokens=1* delims=|" %%a in ('hash /s /crc32 /printf:"%%s|%%s" b\') do (
  4.    set "file=%%b"
  5.    if defined HASH[%%a] (
  6.       setlocal enabledelayedexpansion
  7.       echo !HASH[%%a]! 与 !file! 是重复文件
  8.       endlocal
  9.    )
  10. )
复制代码

作者: pan528    时间: 2014-8-20 20:51

回复 2# CrLf


通过了测试!谢谢!

但如果要挑出不同的文件该怎么写?
作者: CrLf    时间: 2014-8-20 21:06

本帖最后由 CrLf 于 2014-8-22 15:54 编辑

回复 3# pan528


    move 操作不可逆,请先用少量样本测试:
  1. @echo off
  2. for /f "tokens=1* delims=|" %%a in ('hash /s /crc32 /printf:"%%s|%%s\n" a\') do set "HASH[%%a]=%%b"
  3. for /f "tokens=1* delims=|" %%a in ('hash /s /crc32 /printf:"%%s|%%s\n" b\') do (
  4.    set "file=%%b"
  5.    if defined HASH[%%a] (
  6.       setlocal enabledelayedexpansion
  7.       move /y "!HASH[%%a]!" c\ 2>nul
  8.       move /y "!file!" c\
  9.       endlocal
  10.    )
  11. )
复制代码

作者: 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\”移出不相同者,我想求的是直接移出不相同者的方法。当然其他思路也可以。但不能改变原存放目录,因为原目录中的文件量很大,操作效率也是要考虑的一个重要因素。
谢谢你的回贴,你给了我不少启发。如:
按二楼的思路,直接比较相同,可写成:
  1. @echo off
  2. echo 正在操作 ...
  3. FOR /F "usebackq delims=" %%a in (`dir /o:s /s /b a\`) do (
  4. FOR /F "usebackq delims=" %%b in (`dir /o:s /s /b b\`) do (
  5. if %%~za == %%~zb echo %%~nxa 与 %%~nxb 相同!
  6. ))>>相同文件.txt
复制代码

作者: CrLf    时间: 2014-8-22 16:01

4楼代码漏了一个 \n,已修改
计算 hash 需要逐字节读文本,肯定要比比较文件大小慢,但是不容易误判
非要用文件大小作为依据的话,就是这样,实际使用前请用样本测试:
  1. @echo off
  2. echo 正在操作 ...
  3. FOR /F "delims=" %%a in ('dir /s /b a\') do set "SIZE[%%~za]=%%f"
  4. FOR /F "delims=" %%b in ('dir /s /b b\') do (
  5.    if defined #%%~zb (
  6.       set "file=%%~fb"
  7.       setlocal enabledelayedexpansion
  8.       move /y "!SIZE[%%~za]!" c\ 2>nul
  9.       move /y "!file!" c\
  10.       endlocal
  11.    )
  12. )
复制代码





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