บรรทัดคำสั่งเพื่อลบไฟล์ซ้ำๆ แต่ไม่รวมไฟล์บางไฟล์

ฉันต้องลบไฟล์บางประเภท (เช่น ไฟล์ zip) ออกจากโฟลเดอร์และโฟลเดอร์ย่อยทั้งหมดโดยใช้บรรทัดคำสั่ง ตามหลักการแล้ว ฉันกำลังมองหาบางอย่างที่สามารถเรียกใช้เป็นไฟล์ .bat ใน Windows ได้

ฉันรู้ว่ามีสวิตช์ /S สำหรับคำสั่ง DEL เพื่อค้นหาในโฟลเดอร์ย่อย แต่เพื่อเพิ่มความท้าทาย ฉันจำเป็นต้องยกเว้นไฟล์ที่มีชื่อเฉพาะ (ตัวอย่าง "Backup.zip")

มีวิธีลบไฟล์ซ้ำๆ แต่ไม่รวมไฟล์ชื่อใดชื่อหนึ่งหรือไม่ ในสถานการณ์ของฉันจะไม่สามารถแสดงรายการชื่อไฟล์ทั้งหมดที่ฉันต้องการลบอย่างชัดเจน เฉพาะไฟล์ประเภทที่ตรงกันที่ฉันไม่ต้องการลบ


person Tim C    schedule 11.02.2009    source แหล่งที่มา


คำตอบ (7)


เคล็ดลับที่ดี: ทำให้ ไฟล์ของคุณ ต้องการยกเว้นแบบอ่านอย่างเดียว!

DEL /S จะไม่ลบไฟล์แบบอ่านอย่างเดียว

สคริปต์ต่อไปนี้ไม่ได้ตรงทั้งหมดสิ่งที่คุณต้องการ (ดูหมายเหตุของฉันด้านล่าง) แต่จะแสดงให้คุณเห็นว่าไฟล์แบบอ่านอย่างเดียวสามารถใช้เพื่อหลีกเลี่ยงการลบได้อย่างไร

@ECHO OFF
:: This example supposes your first parameter is
:: the relative path to the folder to be deleted
:: and the second is the relative path (from the
:: the target folder) of the one to be excluded
:: Notice that this will only work if the folders
:: are in the working drive, if not, you ll
:: have to specify full paths

IF "%1"=="" GOTO ERROR
IF "%2"=="" GOTO ERROR
IF NOT EXIST %1\NUL GOTO ERROR
CD %1
IF NOT EXIST %2\NUL GOTO ERROR
ECHO Starting up the deletion process
ECHO. * Setting attributes
attrib %1\*.mp3 -r -s -h > NUL
attrib %2\*.mp3 +r > NUL
ECHO. * Deleting files
del /s %1\*.mp3
ECHO. * Reseting attributes
attrib %2\*.mp3 -r > NUL
ECHO.
ECHO Operation completed!
ECHO.
GOTO END

:ERROR
ECHO Parameters:
ECHO. Param1 -> target folder
ECHO. Param2 -> folder to be ignored
ECHO.
GOTO END

:END

หมายเหตุ: คุณสามารถปรับเปลี่ยนสคริปต์นี้เพื่อละเว้นไม่เพียงแค่โฟลเดอร์ย่อย แต่ไฟล์ทั้งหมดตามประเภทที่กำหนด:

attrib /S *.xxx +r > NUL

จะช่วยให้คุณสามารถยกเว้นไฟล์ 'xxx' ทั้งหมดของไดเร็กทอรีปัจจุบัน และไดเร็กทอรีย่อยทั้งหมด (ดังนั้นตัวเลือก /S)


หมายเหตุ: ส่วน "> NUL" คือการเปลี่ยนเส้นทางที่มักใช้เพื่อ ซ่อนเอาต์พุตมาตรฐาน แทนที่จะแสดงบนหน้าจอ
อาจเป็นอันตรายได้หากใช้บ่อยเกินไป (เช่น ในวงวนขนาดใหญ่ที่มีเส้นทางต่างกันที่เกี่ยวข้อง) เนื่องจากเป็นอุปกรณ์ และชอบ อุปกรณ์ทั้งหมด (AUX, COMn, LPTn, NUL และ PRN):

  • การเปิดอุปกรณ์จะอ้างสิทธิ์ในการจัดการไฟล์เดียว อย่างไรก็ตาม อุปกรณ์จะไม่ถูกปิดจนกว่าจะรีบูต ซึ่งต่างจากไฟล์ตรงที่
  • อุปกรณ์แต่ละเครื่องมีอยู่ในทุกไดเร็กทอรีในทุก ๆ ไดรฟ์ ดังนั้นหากคุณใช้การเปลี่ยนเส้นทางไปที่ NUL ใน เช่น C:\ และหลังจากนั้นคุณใช้อีกครั้งใน C:\TEMP คุณจะสูญเสียการจัดการไฟล์อื่น
person VonC    schedule 11.02.2009
comment
ฉันยังไม่เข้าใจบิต NUL แต่ฉันชอบแนวคิดในการตั้งค่าคุณลักษณะ ไชโย! - person Tim C; 11.02.2009
comment
น่าสนใจ! โปรดสังเกตว่า rd /s your_directory จะลบระบบและไฟล์ที่ซ่อนอยู่ด้วย - person Junior Mayhé; 29.11.2009

คุณสามารถวนซ้ำชุดของไฟล์และดำเนินการคำสั่งกับแต่ละไฟล์ได้อย่างง่ายดาย เช่นนี้

set match=D:\blah\M*.zip
for %%x in (%match%) do (
del %%x
)

ฉันคิดว่าคุณต้องอ่านบทความนี้เกี่ยวกับวิธีจัดการสตริงใน DOS: http://www.dostips.com/DtTipsStringManipulation.php

person Magnus Smith    schedule 11.02.2009

ทำได้แค่นี้ ง่ายๆ

  1. ปุ่ม windows + r
  2. พิมพ์ cmd แล้วกด Enter
  3. Navigate to parent directory:
    type c: or d: (or letter of the drive you want to navigate to)
  4. type dir to see a list of that directory's contents ( dir /ah to see hidden files )
  5. จากนั้นหากต้องการเปลี่ยนไดเร็กทอรี ให้พิมพ์ cd xxxx ( xxxx = ชื่อไดเร็กทอรี )
  6. ทำซ้ำ 4&5 จนกว่าคุณจะไปถึงไดเร็กทอรีที่คุณต้องการเรียกใช้การลบแบตช์
  7. จากนั้นพิมพ์รูปแบบของคุณ บางอย่างเช่น: del /S /ah *.jpg และกด Enter มันจะทำงานผ่านไดเรกทอรีย่อยทั้งหมด และลบไฟล์ที่มองเห็นและซ่อนทั้งหมดที่เป็นไฟล์ .jpg

* เป็นไวด์การ์ด
/S ลบออกจากโฟลเดอร์ย่อยทั้งหมด
/ah a = เลือกไฟล์ตามแอตทริบิวต์ h = ซ่อนไว้

ตัวอย่าง: หากต้องการลบไฟล์ .DS_Store ที่น่ารำคาญซึ่งปรากฏขึ้นเมื่อคุณคัดลอกจาก Mac ไปยัง Windows ให้เรียกใช้:

del /S /ah .DS_Store

or

del /S /ah ._*

ซึ่งจะได้รับไฟล์ที่ซ่อนอยู่ 'ซ้ำ' ทั้งหมดที่สร้างขึ้นเมื่อคัดลอกจาก Mac ไปยัง Windows

person ucsarge    schedule 04.03.2012

คุณสามารถใช้ด้านล่าง:

forfiles /p C:\temp-new /s /c "cmd /c if @isdir==FALSE del @file"

การอ้างอิง TechNet ป้อนคำอธิบายลิงก์ที่นี่

person Govardhan Gunnala    schedule 11.11.2011

บางทีคำสั่ง 'forfiles' อาจใช้งานได้

http://technet.microsoft.com/en-us/library/cc753551.aspx

หวังว่าจะช่วยได้

person Community    schedule 11.02.2009

สคริปต์นี้จะลบไฟล์ .zip ทั้งหมดออกจากโฟลเดอร์ (และโฟลเดอร์ย่อย) แต่เฉพาะในกรณีที่ชื่อไฟล์ไม่มีคำว่า "backup" หรือ "Backup" หรือ "BACKUP" ฯลฯ

# Script DeleteZip.txt
var str folder, filelist, file
cd $folder
lf -r -n "*.zip" > $filelist
while ($filelist <> "")
do
    lex "1" $filelist > $file
    # Does this $file contain the word "backup" ? Do case independent search (-c option).
    if ( { sen -c "^backup^" $file } <= 0 )
        system del ("\""+$file+"\"")
    endif
done

สคริปต์อยู่ในรูปแบบ biterscripting ( http://www.biterscripting.com ) บันทึกสคริปต์ในไฟล์ C:/Scripts/DeleteZip.txt เรียกใช้สคริปต์เป็น

script "C:/Scripts/DeleteZip.txt" folder("C:/testfolder")

จะดำเนินการลบในโฟลเดอร์ C:/testfolder และโฟลเดอร์ย่อยทั้งหมด ในทุกระดับ

person P M    schedule 21.02.2010

วิธีง่ายๆ ที่คุณต้องการ:

FORFILES /P "DIRECTORY" /S /M SEARCHMASK /C "cmd /c if @file neq \"FILE_TO_EXCLUDE\" del /f @file"

คุณยังคงสามารถปรับคำสั่งให้เหมาะกับความต้องการของคุณเพื่อแยกไฟล์เฉพาะและ/หรือตามวันที่ได้ รายละเอียดเพิ่มเติมในเอกสาร 'forfiles' ด้านล่าง

https://docs.microsoft.com/pt-br/windows-server/administration/windows-commands/forfiles

person Eduardo Garcia    schedule 10.07.2021