gpt4 book ai didi

Windows批处理文件列出树中的所有重复项(和原始文件)并对它们进行排序

转载 作者:可可西里 更新时间:2023-11-01 10:34:02 27 4
gpt4 key购买 nike

我必须检查一棵树是否有重复文件并将它们全部写入 List.txt 文件。但是我的脚本似乎跳过了每个组中的一个文件位置。 (例如,如果有 4 个重复文件,则列表中只会出现其中的 3 个。)

如果我没记错的话,就是缺少最后一次比较的“previousFile”的位置。我如何将它也写入列表?

此外,我如何按文件名对 List.txt 中的路径进行分组,使其看起来像这样:

文件文件名A.txt:
C:\path1\fileNameA.txt
C:\path2\fileNameA.txt
C:\path3\fileNameA.txt

文件名B.txt:
C:\path1\fileNameB.txt
C:\path2\fileNameB.txt
C:\path3\fileNameB.txt
C:\path4\fileNameB.txt

文件文件名C.txt:
C:\path1\fileNameC.txt
C:\path2\fileNameC.txt

...

?

到目前为止,这是我的脚本:

@echo off

setlocal disableDelayedExpansion

set root=%1

IF EXIST List.txt del /F List.txt

set "prevTest=none"
set "prevFile=none"

for /f "tokens=1-3 delims=:" %%A in (
'"(for /r "%root%" %%F in (*) do @echo %%~zF:%%~fF:)|sort"'
) do (
set "currentTest=%%A"
set "currentFile=%%B:%%C"
setlocal enableDelayedExpansion
set "match="
if !currentTest! equ !previousTest! fc /b "!previousFile!" "!currentFile!" >nul && set match=1
if defined match (
echo File "!currentFile!" >> List.txt
endlocal
) else (
endlocal
set "previousTest=%%A"
set "previousFile=%%B:%%C"
)
)

最佳答案

您需要计算 匹配项并添加 echo 上一个 文件名到echo 当前第一场比赛的情况。

备注'"(for /r "%root%" %%F in (*) do @echo(%%~nxF?%%~zF?%%~fF?)|sort"'变化:

  • 用过? (问号)作为分隔符:Naming Files, Paths, and Namespaces 的保留字符
  • 已添加 %%~nxF? sort 的前缀即使在我草率的测试文件夹结构中,也能按文件名正确输出,请参阅下面的示例输出。

此输出显示比 cmd 还要多文件名中的有毒字符(如 &%! 等)可以用 DisableDelayedExpansion 正确处理。保留。

@ECHO OFF
SETLOCAL EnableExtensions DisableDelayedExpansion
set "root=%~1"
if not defined root set "root=%CD%"

set "previousTest="
set "previousFile="
set "previousName="
set "match=0"

for /f "tokens=1-3 delims=?" %%A in (
'"(for /r "%root%" %%F in (*) do @echo(%%~nxF?%%~zF?%%~fF?x)|sort"'
) do (
set "currentName=%%A"
set "currentTest=%%B"
set "currentFile=%%C"
Call :CompareFiles
)
ENDLOCAL
goto :eof

:CompareFiles
if /I "%currentName%" equ "%previousName%" ( set /A "match+=1" ) else ( set "match=0" )
if %match% GEQ 1 (
if %match% EQU 1 echo FILE "%previousFile%" %previousTest%
echo "%currentFile%" %currentTest%
) else (
set "previousName=%currentName%"
set "previousTest=%currentTest%"
set "previousFile=%currentFile%"
)
goto :eof

以上脚本列出了所有具有重复名称 的文件,无论它们的大小和内容如何。示例输出:

FILE "d:\bat\cliPars\cliParser.bat" 1078
"d:\bat\files\cliparser.bat" 12303
"d:\bat\Unusual Names\cliparser.bat" 12405
"d:\bat\cliparser.bat" 335
FILE "d:\bat\Stack33721424\BÄaá^ cčD%OS%Ď%%OS%%(%1!)&°~%%G!^%~2.foo~bar.txt" 120
"d:\bat\Unusual Names\BÄaá^ cčD%OS%Ď%%OS%%(%1!)&°~%%G!^%~2.foo~bar.txt" 120

列出所有具有相同大小但不考虑其内容的重复名称文件:

:CompareFiles
REM if /I "%currentName%" equ "%previousName%" (
if /I "%currentTest%%currentName%" equ "%previousTest%%previousName%" (
set /A "match+=1"
REM fc /b "%previousFile%" "%currentFile%" >nul && set /A "match+=1"
) else ( set "match=0" )

列出具有相同大小和二进制内容的所有重复名称文件:

:CompareFiles
REM if /I "%currentName%" equ "%previousName%" (
if /I "%currentTest%%currentName%" equ "%previousTest%%previousName%" (
REM set /A "match+=1"
fc /b "%previousFile%" "%currentFile%" >nul && set /A "match+=1"
) else ( set "match=0" )

编辑 如果文件名无关紧要(只有它的内容),您可以在 FOR 中应用下一个更改。循环并进入 :CompareFiles子程序:

@ECHO OFF
SETLOCAL EnableExtensions DisableDelayedExpansion
set "root=%~1"
if not defined root set "root=%CD%"

set "previousTest="
set "previousFile="
set "match=0"

for /f "tokens=1-2 delims=?" %%A in (
'"(for /r "%root%" %%F in (*) do @echo(%%~zF?%%~fF?)|sort"'
) do (
set "currentTest=%%A"
set "currentFile=%%B"
rem optional: skip all files of zero length
if %%A GTR 0 Call :CompareFiles
)
ENDLOCAL
goto :eof

:CompareFiles
if /I "%currentTest%" equ "%previousTest%" (
fc /b "%previousFile%" "%currentFile%" >nul && set /A "match+=1"
) else ( set "match=0" )
if %match% GEQ 1 (
if %match% EQU 1 echo FILE "%previousFile%" %previousTest%
echo "%currentFile%" %currentTest%
) else (
set "previousTest=%currentTest%"
set "previousFile=%currentFile%"
)
goto :eof

关于Windows批处理文件列出树中的所有重复项(和原始文件)并对它们进行排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37531185/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com