วิธีลบไฟล์ทั้งหมดที่ส่งคืนโดยการค้นหา


13

ในขณะที่เขาเป็นสิ่งที่ฉันทำ:

ขั้นตอนที่ 1:

locate fooBar
/home/abc/fooBar
/home/abc/Music/fooBar

ขั้นตอนที่ 2:

ทำการลบด้วยตนเองโดยการคัดลอกวางแต่ละบรรทัด

rm /home/abc/fooBar
rm /home/abc/Music/fooBar

ฉันจะทำสิ่งนี้ในขั้นตอนเดียวได้อย่างไร สิ่งที่ต้องการ

ค้นหา fooBar> rm

ขอบคุณ


คุณต้องการสิ่งนี้หรือไม่ rm -i ค้นหา fooBar``
LFC_fan

ฉันไม่แน่ใจว่าสิ่งที่ได้กล่าวมา ฉันต้องการลบไฟล์ทั้งหมดออกจากพา ธ ที่ส่งคืนเมื่อฉันรันคำสั่งค้นหา
theTuxRacer

คำตอบ:


13

ตามที่ chaps อื่น ๆ ได้กล่าวไปแล้ว xargs คือเพื่อนของคุณ มันเป็นเครื่องมือที่ทรงพลังจริงๆและฉันจะพยายามอธิบายและให้วิธีแก้ปัญหาสำหรับ gotcha ทั่วไป

สิ่งที่ xargs ทำคือนำบรรทัดจากอินพุตและผนวกเข้ากับคำสั่งอื่นดำเนินการคำสั่งอื่นสำหรับทุกบรรทัดในอินพุต ดังนั้นโดยการพิมพ์locate foobar | xargs rm -f, ผลลัพธ์ของคำสั่งค้นหาจะได้รับการติดตั้งบนท้ายของคำสั่งและดำเนินการสำหรับแต่ละสายการผลิตโดยrm -flocate foobar

The gotcha:

แต่จะเกิดอะไรขึ้นถ้ามีช่องว่างในบรรทัดของคุณส่งคืนโดยการค้นหา ที่จะทำลายrm -fคำสั่งเพราะข้อโต้แย้งที่ส่งผ่านไปยัง RM จะต้องเป็นไฟล์ (เว้นแต่คุณจะใช้สวิตช์ -r) และเส้นทางไฟล์จะต้องมีการหลบหนีหรือยกมาถ้ามีช่องว่าง

xargs จัดเตรียมสวิตช์ -i เพื่อแทนที่อินพุตลงในคำสั่งที่ตามมาแทนการต่อท้าย ดังนั้นฉันจะเปลี่ยนคำแนะนำเป็น

locate foobar | xargs -ixxx rm -f 'xxx'

ซึ่งตอนนี้จะแตกก็ต่อเมื่อชื่อไฟล์ที่ส่งคืนโดยค้นหา apostrophes มีอยู่

ฉันต้องเห็นด้วยกับ qbi ว่าคุณควรระวังเกี่ยวกับการใช้ rm -f ! ใช้แฟล็ก -p เพื่อ xargs หรือเพียงรันการค้นหา foobar ด้วยตัวเองก่อนป้อนไปยัง xargs หรือปล่อย -f จาก rm

locate foobar | xargs -p -ixxx rm -f 'xxx'

9
เพื่อให้ทนทานต่อไฟล์ที่มีอักขระแปลกใหม่ (ขึ้นบรรทัดใหม่อัญประกาศ apostrophes และอื่น ๆ ) ในชื่อพวกเขาคุณสามารถใช้ตัวเลือก-0( --null) เพื่อค้นหาและ xargs ใช้อักขระ ASCII NUL ที่ปลอดภัยเพื่อแยกชื่อไฟล์:locate -0 foobar | xargs -0 rm
Jukka Matilainen

1
+1 สำหรับการตอบกลับและเลือกให้กล่าวถึง gotcha ^ _ ^
theTuxRacer

ฉันลองแล้ว แต่มันใช้งานไม่ได้
Pronoy999

ทำงานบางส่วน
SteveS

7

xargsคุณอาจจะต้องบางตัวเลือกมากขึ้นสำหรับการใช้งานกับ xargs -pทดสอบครั้งแรกกับ หากตกลงให้ลบ-pตัวเลือก:

locate foobar | xargs rm

6

หากต้องการลบไฟล์ทั้งหมดที่ส่งคืนโดยค้นหาให้ใช้คำสั่งต่อไปนี้ในเทอร์มินัลของคุณ

locate foobar | xargs rm -f

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