2015-05-26 83 views
0

給定兩個目錄c:\ foo和c:\ bar我想刪除c:\ bar中與c:\ foo中存在的文件相同的文件。我可以使用fc命令將c:\ bar中的每個文件與c:\ foo中的同名文件進行比較,並手動刪除重複項。有沒有簡單的方法來使用CMD自動執行此操作?使用Windows命令行刪除重複文件

+0

最簡單的方法與一批要做到這一點文件是編寫一個Powershell腳本並從批處理文件中調用它。 –

+0

你的意思是'批處理文件'或'命令行'? – Endoro

+0

批處理文件或我可以從命令行執行的一行代碼都很好。 – Fortranner

回答

2
@echo off 

cd c:\bar 
for %%a in (*.*) do for %%b in ("c:\foo\%%a") do (
    if exist "%%b" (
     if "%%~Ta %%~Za" equ "%%~Tb %%~Zb" (
     del "%%a" 
    ) else (
     fc "%%a" "%%b" > NUL 
     if not errorlevel 1 del "%%a" 
    ) 
    ) 
) 

如果兩個文件可能有不同的修改日期但是相同,請在比較中刪除%%~T..零件。

+0

謝謝,但我試着運行腳本,它似乎刪除*不*重複的文件,而不是那些。 – Fortranner

+0

將「neq」替換爲「equ」並在errorlevel 1之前添加「not」使得代碼按照我想要的操作,謝謝。 – Fortranner

+0

行動,你是對的!固定... – Aacini

4

如果相同裝置similar or alike in every way:在方式,不僅在日期大小,因此被迫二進制比較

@ECHO OFF >NUL 
SETLOCAL enableextensions 
pushd "D:\bat\FooBar" 
for /F "delims=" %%G in ('dir /B /A:-D *.*') do (
    call :proFC "%%~fG" "D:\bat\FooFoo\%%~nxG" 
) 
popd 
ENDLOCAL 
goto :eof 

:raiseerror 
exit /B %1 

:proFC 
    call :raiseerror 321 
    fc /B "%~1" "%~2" >NUL 2>&1 
    if %errorlevel% EQU 0 (
    echo del "%~1" 
) else (
    echo %errorlevel% "%~2" 
) 
goto :eof 

評論在上述腳本關鍵點:

  • pushd ...個交換機當前工作目錄
  • for /F ...環對待酒吧文件夾的靜態文件列表
  • popd切換當前工作目錄回到
  • goto :eof結束腳本

:raiseerror子程序經由exit /B %1

:proFC生產子程序返回退出代碼

FC將設置一個ErrorLevel如下(但看到一則說明在call :raiseerror 321點):

-1 Invalid syntax (e.g. only one file passed) 
0 The files are identical. 
1 The files are different. 
2 Cannot find at least one of the files.