ลบไฟล์ซ้ำ ๆ


140

ใครบ้างมีวิธีการลบไฟล์ที่น่ารำคาญ. _ และ. DS_ ที่เก็บที่ได้รับหลังจากย้ายไฟล์จาก Mac ไปยัง A Linux Server หรือไม่

ระบุไดเรกทอรีเริ่มต้นและปล่อยมันไปไหม? กดไลค์ / var / www / html / down ...


แม้ว่าจะไม่ใช่ IMO ที่ซ้ำกันคุณควรดูที่: stackoverflow.com/questions/1280429/…
Grundlefleck

แม้ว่าจะไม่ใช่สิ่งที่คุณถาม ฉันจะเถียงว่านี่เป็นวิธีแก้ปัญหาที่ดีกว่า: unix.stackexchange.com/questions/9665/…
Viktor

คำตอบ:


169

เปลี่ยนเป็นไดเร็กทอรีและใช้:

find . -name ".DS_Store" -print0 | xargs -0 rm -rf
find . -name "._*" -print0 | xargs -0 rm -rf

ไม่ได้ทดสอบให้ลองโดยไม่ใช้ xargs ก่อน!

คุณสามารถแทนที่ช่วงเวลาหลังจากค้นหาด้วยไดเรกทอรีแทนที่จะเปลี่ยนเป็นไดเรกทอรีก่อน

find /dir/here ...

2
ฉันรู้ว่าคำถามของเขาไม่ได้ถาม แต่ฉันจำไม่ได้ว่า: ตัวอย่างของคุณจัดการชื่อไฟล์ด้วยช่องว่างหรือไม่?
Grundlefleck

4
ใช่นั่นคือสิ่งที่ print0 และ -0 ถึง xargs โดยปกติจะไม่จัดการช่องว่างอย่างถูกต้องอย่างไรก็ตามด้วย print0 มันจะพิมพ์ชื่อไฟล์ด้วยอักขระ null ที่ท้ายบรรทัดซึ่ง xarg ด้วย -0 จะใช้เพื่อส่งผ่านพา ธ แบบเต็มไปยัง xargs โดยไม่ต้องมีช่องว่าง การใช้พารามิเตอร์ที่สองหรือสามไปยังคำสั่ง rm ซึ่งอาจไม่ดีจริงๆ!
X-Istence

7
@X: findutils ที่ใหม่กว่ารองรับการ-deleteดำเนินการซึ่งสามารถย่อให้สั้นลงได้ @JT: .การค้นหานี้ซ้ำภายใต้ ขึ้นอยู่กับจำนวนไฟล์และไดเรกทอรีย่อยที่มี ... คุณไม่เพียง แต่ห้ามไม่ให้อัปโหลดไฟล์เหล่านั้นหรือ
ephemient

1
การใช้-r(recursive) ธงไม่แนะนำให้ใช้ในกรณีนี้เนื่องจากคุณไม่ต้องการที่จะลบไดเรกทอรีใด ๆ ..
แดเนียลโซฮาร์

2
@IlmariKaronen: จุดดี จะไม่command rmเป็นทางออกที่ดีกว่า (นั่นคือโดยตรงมากขึ้น)? (โดย "โดยตรง" ฉันหมายถึงมันเกี่ยวกับปัญหาเฉพาะที่มือและไม่มีอะไรอื่นและดังนั้นจึงมีโอกาสน้อยที่จะมีผลข้างเคียงที่ไม่พึงประสงค์และยังจะอธิบายด้วยตนเองมากขึ้นกับทุกคนที่ต้องรักษารหัส ในภายหลัง)
iconoclast


86

ใหม่กว่า findutils รองรับ-deleteดังนั้น:

find . -name ".DS_Store" -delete

เพิ่ม-printเพื่อรับรายการการลบด้วย

คำสั่งจะทำงานให้คุณหากคุณมีระบบ POSIX ที่ทันสมัยฉันเชื่อว่า อย่างน้อยมันก็ใช้ได้กับฉันใน OS X 10.8 และใช้ได้กับคนอื่น ๆ ที่เคยทดสอบกับ macOS 10.12 (โมฮาวี)

ให้เครดิตกับ @ephemient ในความคิดเห็นในโพสต์ของ @ X-Istence (คิดว่าเป็นประโยชน์พอที่จะรับประกันคำตอบของตัวเอง)


1
ใช้งานได้ใน OSX 10.6 เช่นกัน
hoss

3
ทางออกที่สะอาดและง่ายที่สุด +1!
limist

6
@OneOfOne: ตามความคิดเห็นของฉันบอกว่าฉันได้รับจาก @ ephemient ในฐานะที่เป็นผู้เริ่มต้นในการทุบตีฉันพบวิธีแก้ปัญหาของคุณ มันอาจจะเหมือนกันกับการใช้งาน แต่ฉันพบว่ารูปแบบนี้มีความชัดเจนมากกว่า
rattray

1
The '.' ไม่จำเป็นเนื่องจากจะfindเรียกใช้ไดเรกทอรีทำงานปัจจุบันซ้ำโดยค่าเริ่มต้น
Tom Russell

ในโปรแกรมรุ่นที่ใหม่กว่าไดเรกทอรีอาจถูกละเว้นและมันจะบ่งบอกถึงไดเรกทอรีการทำงานปัจจุบัน (วิกิพีเดีย ) คุณยังต้องการ.ใน macOS 10.12 (Sierra)
Dem Pilafian

18

คำสั่งง่าย ๆ :

rm `find ./ -name '.DS_Store'` -rf
rm `find ./ -name '._'` -rf

โชคดี!


1
มันใช้งานได้ดี แต่คำเตือนฉันเพิ่งใช้rm -i find ./ -name '* py'` -rf , which did NOT prompt me to delete files. you will need to take it on the end (i.e. -rfi`) ขอบคุณพระเจ้าสำหรับสคริปต์สำรองของฉัน
ryanjdillon

1
หากมีไฟล์จำนวนมากเกินไปสิ่งนี้จะทำให้เกิดข้อผิดพลาด:-bash: /bin/rm: Argument list too long
Viktor

12
cd /var/www/html && find . -name '.DS_Store' -print0 | xargs -0 rm
cd /var/www/html && find . -name '._*' -print0 | xargs -0 rm

2
ฉันชอบอันนี้ดีกว่าเพียงเพราะ "rm" ไม่มี "-r" ซึ่งไม่จำเป็นสำหรับงานเฉพาะนี้
ล็อตออฟฟรี

6

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

$ rm /var/www/html/**/_* /var/www/html/**/.DS_Store

คุณสามารถรวมพวกเขาเช่นนี้:

$ rm /var/www/html/**/(_*|.DS_Store)

Zsh มีคุณสมบัติอื่น ๆ มากมายที่ทุบตีขาด แต่สิ่งเดียวที่คุ้มค่ากับการเปลี่ยน มันมีอยู่ในลินุกซ์ distros ส่วนใหญ่ (อาจจะทั้งหมด) เช่นเดียวกับ cygwin และ OS X

คุณสามารถค้นหาข้อมูลเพิ่มเติมเกี่ยวกับเว็บไซต์ zsh


1
ปัญหาที่เป็นไปได้: เนื่องจากคุณไม่ได้ใช้ xargs คุณอาจพบข้อจำกัดความยาวบรรทัดคำสั่ง นอกจากนี้ทุบตี 4 สนับสนุน**เกินไป :-) (แม้ว่าจะไม่ได้โดยเริ่มต้นshopt -s globstarจะต้องมีการตั้งค่า)
ephemient

4
find . -name "FILE-TO-FIND"-exec rm -rf {} \;

การใช้ exec สำหรับแต่ละไฟล์ที่พบนั้นไม่รวดเร็ว มันเร็วกว่าที่จะพบพิมพ์มันออกมาแล้วใช้ xargs เพื่อเรียกใช้ rm หนึ่งครั้ง
X-Istence

3
อย่างไรก็ตามหากคุณมีfindที่รองรับมันก็+เหมือน xargs: find . -name "FILE-TO-FIND" -exec rm -rf {} +- (เช่นคุณจะต้องเว้นวรรคก่อน-exec)
หยุดชั่วคราวจนกว่าจะมีการแจ้งให้ทราบต่อไป

3
เราไม่เคยมี xargs ในวันของฉัน และเราต้องเดินไปโรงเรียนขึ้นเนินทั้งสองทาง .......
Martin Beckett

3

ตัวอย่างการลบ "Thumbs.db" ซ้ำ ๆ

find . -iname "Thumbs.db" -print0 | xargs -0 rm -rf

ตรวจสอบโดย:

find . -iname "Thumbs.db"

ตอนนี้ควรจะไม่แสดงรายการใด ๆ ด้วย "Thumbs.db" ภายในเส้นทางปัจจุบัน


โปรดตรวจสอบให้แน่ใจว่าคำตอบของคุณพิมพ์รายการสิ่งที่ถูกลบและอธิบายว่าทำไมบางคนอาจต้องการใช้xargsและprint0แทนที่จะเป็นexec(มีเหตุผล)
Josh Habdas


2

ถ้าคุณมี Bash 4.0 ++

#!/bin/bash
shopt -s globstar
for file in /var/www/html/**/.DS_Store /var/www/html/**/._ 
do
 echo rm "$file"
done

2
การรันสำเนา rm ใหม่สำหรับแต่ละไฟล์นั้นสิ้นเปลือง
X-Istence

2
@ X-Istence การเพิ่มประสิทธิภาพก่อนวัยอันควรสิ้นเปลือง
Lucina

เพิ่มขึ้นสำหรับความคิดริเริ่มและการใช้นวัตกรรมทุบตีล่าสุด
Josh Habdas

1

สิ่งที่ควรทราบ:

'-delete' ไม่สามารถเรียกซ้ำได้ ดังนั้นหาก. รายการชั่วคราว (โฟลเดอร์) มีไฟล์อยู่คำสั่งจะล้มเหลว

มีไฟล์ที่น่ารำคาญมากมายที่สร้างโดย macs: .DS_Store ._. DS_Store. รายการชั่วคราว. apdisk

คำสั่งนี้จัดการกับทุกคำสั่ง บันทึกจากการเรียกใช้ค้นหาซ้ำแล้วซ้ำอีกสำหรับการแข่งขันหลายรายการ

find /home/foo \( -name '.DS_Store' -or -name '._.DS_Store' -or -name '._*' -or -name '.TemporaryItems' -or -name '.apdisk' \) -exec rm -rf {} \;

0

สิ่งนี้ยังใช้งานได้:

sudo rm -rf 2018-03-*

ที่นี่การลบไฟล์ของคุณด้วยชื่อของรูปแบบ 2018-03- (อย่างอื่น)

ง่าย ๆ เข้าไว้


คุณไม่ต้องอธิบายเมื่อมีคนอาจต้องการนำหน้าคำสั่งด้วย sudoหรือไม่ให้ข้อมูลใด ๆ ว่าrmทำงานอย่างไรในบริบทของคำตอบของคุณ
Josh Habdas
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.