标题: [文本处理] [已解決]批处理比较两个文件,只显示第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- 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 - @echo off
- for /f "delims=" %%i in ('findstr /v /g:"file_list2.txt" "file_list1.txt"') do (
- copy "e:\data\%%i" "d:\test\"
- )
复制代码
作者: thp2008 时间: 2020-4-20 19:11
谢谢Batcher,搞定
作者: thp2008 时间: 2020-4-20 20:15
回复 2# went
我还想问问,在这个基础上,能不能用批处理,更深入一些进行比较,这是我根据你们提供的帮助,修改的一个比对的批处理。
我在想,可不可以更先进一些,生成两个文本文件目录列表的时候,带上文件的大小,顺便比较一下文件的大小是否一致,如果不一致,就将它的文件名列出来,麻烦大哥,再帮我修改一下,十分感谢!- @echo off
- del file_list1.txt
- del file_list2.txt
- cls
- echo.
- echo 本批处理的功能:比较两个目标中,某一类行的文件,是否相同,不同的话,就列出缺少的文件名并可自动复制缺少的文件。
- echo.
- echo 源目录示例:D:\Download\Data
- set /p INP1=请输入第一个要比较的目录名的完整路径(源目录):
- echo.
- echo.
- echo 目标目录示例:E:\Share\A001
- set /p INP2=请输入第二个要比较的目录名的完整路径(目标目录):
- echo.
- echo.
- set /p filetype=请输入要比较的文件名称类型(例如:“*.rar”):
-
- dir "%INP1%\%filetype%" /b>>file_list1.txt
- dir "%INP2%\%filetype%" /b>>file_list2.txt
-
- findstr /v /g:"file_list2.txt" "file_list1.txt"
- echo.
- echo.
- echo 是否自动复制上述文件到目标目录。
- echo.
- pause
- echo.
- for /f "delims=" %%i in ('findstr /v /g:"file_list2.txt" "file_list1.txt"') do (
- copy "%INP1%\%%i" "%INP2%" && echo "%INP1%\%%i" "%INP2%"
- )
- echo.
- pause
-
- del file_list1.txt
- del file_list2.txt
复制代码
作者: thp2008 时间: 2020-4-20 21:07
本帖最后由 thp2008 于 2020-4-20 21:31 编辑
我在网上找到个方法,可以实现,但是发现有个小问题
代码如下:- forfiles /P "%INP1%" /m %filetype% /C "cmd /c echo @file @fsize" >>file_list1.txt
- 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- for /f "delims=" %%i in ('findstr /v /g:"file_list2.txt" "file_list1.txt"') do (
- 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
我整个修改好的,放上来,给有同样需要的朋友直接用吧- @echo off
- del file_list1.txt
- del file_list2.txt
- cls
- echo.
- echo 本批处理的功能:比较两个目标中,某一类行的文件,是否相同,不同的话,就列出缺少的文件名并可自动复制缺少的文件。
- echo.
- echo 源目录示例:D:\Download\Data
- set /p INP1=请输入第一个要比较的目录名的完整路径(源目录):
- echo.
- echo.
- echo 目标目录示例:E:\Share\A001
- set /p INP2=请输入第二个要比较的目录名的完整路径(目标目录):
- echo.
- echo.
- set /p filetype=请输入要比较的文件名称类型(例如:“*.rar”):
-
- REM dir "%INP1%\%filetype%" /b>>file_list1.txt
- REM dir "%INP2%\%filetype%" /b>>file_list2.txt
- forfiles /P "%INP1%" /m %filetype% /C "cmd /c echo @file @fsize" >>file_list1.txt
- forfiles /P "%INP2%" /m %filetype% /C "cmd /c echo @file @fsize" >>file_list2.txt
-
- findstr /v /g:"file_list2.txt" "file_list1.txt"
- echo.
- echo.
- echo 是否自动复制上述文件到目标目录。
- echo.
- pause
- echo.
- for /f %%i in ('findstr /v /g:"file_list2.txt" "file_list1.txt"') do (
- copy "%INP1%\%%i" "%INP2%" && echo "%INP1%\%%i" "%INP2%"
- )
- echo.
- pause
- del file_list1.txt
- del file_list2.txt
复制代码
欢迎光临 批处理之家 (http://www.bathome.net/) |
Powered by Discuz! 7.2 |