2017-07-28 125 views
1

我有以下文件結構的文件夾:如何刪除與父目錄中的文件具有相同名稱的子目錄中的文件?

  • 根(DIR)
    • Filename1.jpg
    • Filename2.jpg
    • Filename3.jpg
    • 子目錄(DIR)
      • Filename1.jpg
      • Filename2.jpg
      • Filename3.jpg
      • SubDirectory2(DIR)
        • FileName1.jpg
        • FileName2.jpg

等。模式繼續n次。

如果刪除子目錄中的文件(如果它存在於文件夾/文件層次結構中的更高級別)?所以,如果相同的文件名存在於更高級別的文件夾中,我試圖擺脫子目錄中的重複文件。

+3

你有什麼試過,你試過的怎麼都失敗了?理想情況下,您應該提供您嘗試過的[最小,完整和可驗證的示例](https://stackoverflow.com/help/mcve),幷包含有關失敗的具體信息,包含錯誤消息和/或錯誤的輸出。 SO不是代碼寫入服務;最好的問題是提供有用信息的問題,以便那些回答問題的人可以指導你設計自己的正確答案。參見[如何提出一個好問題](https://stackoverflow.com/help/how-to-ask)。 –

+0

骨架:循環目錄中的文件,對於每個文件運行通過所有子文件夾,檢查文件是否具有相同的文件名,將其刪除。你可以輕鬆地谷歌的東西在一起,你需要的:) – geisterfurz007

回答

0

這可以用只有兩個FOR環和一個IF條件來完成:

@echo off 
rem Process all files in current directory and all its subdirectories. 

rem For each file first check if the file still exists after processing 
rem the other files before. 

rem For each file still existing search for this file in its directory 
rem and all its subdirectories with skipping from output of command DIR 
rem the first line which is the current file to keep. 

for /F "delims=" %%I in ('dir * /A-D /B /S 2^>nul') do (
    if exist "%%I" (
     for /F "skip=1 delims=" %%J in ('dir "%%I" /A-D /B /S 2^>nul') do del "%%J" 2>nul 
    ) 
) 

注:在執行它的批處理文件不應該被刪除。這可以通過讓它不存儲在目錄樹中進行處理,或者只在目錄樹中處理一次,或者至少在最高級目錄樹上運行批處理文件來處理來實現。

當然,可以指定在第一目錄例如*.jpg *.png *.tif,而不是僅僅*只處理JPEG,PNG和TIFF文件,而忽略在目錄樹中的所有其他文件。

請使用測試運行這個修改後的版本沒有真正刪除文件:

@echo off 
for /F "delims=" %%I in ('dir * /A-D /B /S 2^>nul') do (
    echo File: "%%I" 
    if exist "%%I" (
     for /F "skip=1 delims=" %%J in ('dir "%%I" /A-D /B /S 2^>nul') do echo del "%%J" 2>nul 
    ) 
) 

會有線產量不足時,文件的刪除,因爲if exist "%%I"是真的做不會總是正確的,因爲它是這種批處理代碼的情況。

爲了解所使用的命令及其工作方式,請打開命令提示符窗口,在其中執行以下命令,並仔細閱讀爲每個命令顯示的所有幫助頁面。

  • del /?
  • dir /?
  • echo /?
  • if /?

閱讀也是微軟文章的2>nul解釋由手柄把它們放在STDERR,制止錯誤信息大約Using Command Redirection Operators設備NUL

重定向操作符>必須在第一轉義FOR與脫字符^命令行被解釋爲文字字符由Windows命令解釋器,但作爲重定向操作以後由單獨的命令過程處理所述FOR命令行通過FOR在後臺執行的DIR命令行並捕獲其輸出寫入由處理STDOUT用於處理執行。

相關問題