Board logo

标题: [文本处理] [已解決]批处理比较两个文件,只显示第2个文件不存在的行 [打印本页]

作者: thp2008    时间: 2020-4-18 23:21     标题: [已解決]批处理比较两个文件,只显示第2个文件不存在的行

有两个文本文件,都是每一行,一个文件名,两个文件的行数可能不同。
比如1.txt里面比较全,2.txt没那么全,我想将1.txt中,多出来的文件名,显示出来,我使用fc 1.txt 2.txt

fc /w 1.txt 2.txt
正在比较文件 1.txt 和 2.TXT
***** 1.txt
Vol.211.rar
Vol.212.rar
Vol.213.rar
***** 2.TXT
Vol.211.rar
Vol.213.rar
*****

***** 1.txt
Vol.326.rar
Vol.329.rar
Vol.330.rar
***** 2.TXT
Vol.326.rar
Vol.330.rar
*****

的确可以显示出来,其中Vol.212.rar和Vol.329.rar就是多出来的文件名,但是fc会把Vol.211.rar
Vol.213.rar Vol.326.rar  Vol.330.rar 这几个已存在的也列出来,所以我想找高手用批处理,实现,只将Vol.212.rar和Vol.329.rar显示出来,其它的不显示,如何做到,谢谢!
作者: went    时间: 2020-4-19 12:44

用findstr
  1. findstr /v /g:"2.txt" "1.txt"
复制代码

作者: thp2008    时间: 2020-4-20 11:23

回复 2# went

非常好用,完全满足我的需要,非常感谢您的帮助!
作者: thp2008    时间: 2020-4-20 18:08

findstr /v /g:"file_list2.txt" "file_list1.txt"
Vol.197.rar
Vol.201.rar
Vol.204.rar
Vol.206.rar
Vol.207.rar
Vol.210.rar
Vol.217.rar
Vol.224.rar
我想再请教一下您
比如,我运行后,获得了这些文件名,我如何将每一个文件名作为变量,赋予给另一个命令,如下:
copy e:\data\vol.197.rar  d:\test\
copy e:\data\vol.201.rar  d:\test\
copy e:\data\vol.204.rar  d:\test\
copy e:\data\vol.206.rar  d:\test\
copy e:\data\vol.207.rar  d:\test\
copy e:\data\vol.210.rar  d:\test\
copy e:\data\vol.217.rar  d:\test\
copy e:\data\vol.224.rar  d:\test\

这样就可以全自动运行了,不用一个一个去拷贝了

谢谢!
作者: Batcher    时间: 2020-4-20 18:30

回复 4# thp2008
  1. @echo off
  2. for /f "delims=" %%i in ('findstr /v /g:"file_list2.txt" "file_list1.txt"') do (
  3.     copy "e:\data\%%i" "d:\test\"
  4. )
复制代码

作者: thp2008    时间: 2020-4-20 19:11

谢谢Batcher,搞定
作者: thp2008    时间: 2020-4-20 20:15

回复 2# went


我还想问问,在这个基础上,能不能用批处理,更深入一些进行比较,这是我根据你们提供的帮助,修改的一个比对的批处理。
我在想,可不可以更先进一些,生成两个文本文件目录列表的时候,带上文件的大小,顺便比较一下文件的大小是否一致,如果不一致,就将它的文件名列出来,麻烦大哥,再帮我修改一下,十分感谢!
  1. @echo off
  2. del file_list1.txt
  3. del file_list2.txt
  4. cls
  5. echo.
  6. echo 本批处理的功能:比较两个目标中,某一类行的文件,是否相同,不同的话,就列出缺少的文件名并可自动复制缺少的文件。
  7. echo.
  8. echo 源目录示例:D:\Download\Data
  9. set /p INP1=请输入第一个要比较的目录名的完整路径(源目录):
  10. echo.
  11. echo.
  12. echo 目标目录示例:E:\Share\A001
  13. set /p INP2=请输入第二个要比较的目录名的完整路径(目标目录):
  14. echo.
  15. echo.
  16. set /p filetype=请输入要比较的文件名称类型(例如:“*.rar”):
  17. dir "%INP1%\%filetype%" /b>>file_list1.txt
  18. dir "%INP2%\%filetype%" /b>>file_list2.txt
  19. findstr /v /g:"file_list2.txt" "file_list1.txt"
  20. echo.
  21. echo.
  22. echo 是否自动复制上述文件到目标目录。
  23. echo.
  24. pause
  25. echo.
  26. for /f "delims=" %%i in ('findstr /v /g:"file_list2.txt" "file_list1.txt"') do (
  27.     copy "%INP1%\%%i" "%INP2%"  && echo "%INP1%\%%i" "%INP2%"
  28. )
  29. echo.
  30. pause
  31. del file_list1.txt
  32. del file_list2.txt
复制代码

作者: thp2008    时间: 2020-4-20 21:07

本帖最后由 thp2008 于 2020-4-20 21:31 编辑

我在网上找到个方法,可以实现,但是发现有个小问题
代码如下:
  1. forfiles /P "%INP1%"  /m %filetype% /C "cmd /c echo @file @fsize"  >>file_list1.txt
  2. forfiles /P "%INP2%"  /m %filetype% /C "cmd /c echo @file @fsize"  >>file_list2.txt
复制代码
就是差生两个文件列表的时候,可以用这两个命令,问题一,但是我发现,就是比对后,列出了文件列表,也正确,但这个时候,传递给COPY的时候,因我多带了后面的文件大小,文件名就不正确了,如何传递的时候,只取前面的文件名,不要后面的文件大小。
格式如下:

"Vol.001.rar" 3287419372
"Vol.002.rar" 3305220652
"Vol.003.rar" 3267572228
"Vol.004.rar" 3212365756
"Vol.005.rar" 3105736980
"Vol.006.rar" 3172399796
  1. for /f "delims=" %%i in ('findstr /v /g:"file_list2.txt" "file_list1.txt"') do (
  2.     copy "%INP1%\%%i" "%INP2%"  && echo "%INP1%\%%i" "%INP2%"
复制代码
就这个问题,谢谢!
作者: went    时间: 2020-4-20 23:18

回复 8# thp2008


    把"delims="去掉试试
作者: thp2008    时间: 2020-4-23 16:36

回复 9# went


    这招真的可以哟,谢谢
作者: thp2008    时间: 2020-4-23 16:39

我整个修改好的,放上来,给有同样需要的朋友直接用吧
  1. @echo off
  2. del file_list1.txt
  3. del file_list2.txt
  4. cls
  5. echo.
  6. echo 本批处理的功能:比较两个目标中,某一类行的文件,是否相同,不同的话,就列出缺少的文件名并可自动复制缺少的文件。
  7. echo.
  8. echo 源目录示例:D:\Download\Data
  9. set /p INP1=请输入第一个要比较的目录名的完整路径(源目录):
  10. echo.
  11. echo.
  12. echo 目标目录示例:E:\Share\A001
  13. set /p INP2=请输入第二个要比较的目录名的完整路径(目标目录):
  14. echo.
  15. echo.
  16. set /p filetype=请输入要比较的文件名称类型(例如:“*.rar”):
  17. REM dir "%INP1%\%filetype%" /b>>file_list1.txt
  18. REM dir "%INP2%\%filetype%" /b>>file_list2.txt
  19. forfiles /P "%INP1%"  /m %filetype% /C "cmd /c echo @file @fsize"  >>file_list1.txt
  20. forfiles /P "%INP2%"  /m %filetype% /C "cmd /c echo @file @fsize" >>file_list2.txt
  21. findstr /v /g:"file_list2.txt" "file_list1.txt"
  22. echo.
  23. echo.
  24. echo 是否自动复制上述文件到目标目录。
  25. echo.
  26. pause
  27. echo.
  28. for /f  %%i in ('findstr /v /g:"file_list2.txt" "file_list1.txt"') do (
  29.     copy "%INP1%\%%i" "%INP2%"  && echo "%INP1%\%%i" "%INP2%"
  30. )
  31. echo.
  32. pause
  33. del file_list1.txt
  34. del file_list2.txt
复制代码





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