ให้เอาต์พุต grep เป็น rm


47

ฉันพยายามที่จะgrepส่งออกท่อไปrmแต่มันก็ส่งผลสิ่งที่ไร้ประโยชน์ จำเป็นต้องมีสวิตช์rmหรือไม่ หรือสามารถrmให้ regexp โดยตรงได้หรือไม่

ls | grep '^\[Daruchini'| rm

rm: ตัวถูกดำเนินการที่หายไปลองใช้ `rm - ช่วย 'สำหรับข้อมูลเพิ่มเติม


คัดลอกวางข้อความผิดพลาดเสมอ (ผมเคยแทรกข้อความข้อผิดพลาดที่เกิดขึ้นจริงเพื่อประโยชน์ของผู้อ่านในอนาคต. แต่ฉันเท่านั้นที่สามารถทำเช่นนี้เพราะมีข้อผิดพลาดเพียงคนเดียวที่เป็นไปได้ในกรณีนี้. ส่วนใหญ่เวลาที่มันเป็นสิ่งสำคัญที่จะมีแน่นอนข้อผิดพลาดที่จะเข้าใจปัญหาที่เกิดขึ้น . ดังนั้นคัดลอก - วางข้อความแสดงข้อผิดพลาดทั้งหมดเสมอ)
Gilles 'ดังนั้น - หยุดความชั่วร้าย'

คำตอบ:


57

คุณจำเป็นต้องใช้ในการเปิดเข้ามาตรฐานเข้าไปในข้อโต้แย้งxargsrm

$ ls | grep '^Dar' | xargs rm

(ระวังตัวอักษรพิเศษในชื่อไฟล์ด้วย grep GNU คุณอาจจะชอบ

$ ls | grep -Z '^Dar' | xargs -0 rm

)

นอกจากนี้ในขณะที่เชลล์ไม่ได้ใช้ regexps นั่นเป็นรูปแบบที่เรียบง่าย:

$ rm Dar*

(ในขณะเดียวกันฉันคิดว่าฉันต้องการนอนมากกว่านี้)


2
สมมติว่าผู้ถามไม่ได้ทำผิดพลาดเมื่อ (s) เขาโพสต์คำถาม (s) เขาหลังจากไม่rm Dar* rm !(Dar*)
Gilles 'หยุดความชั่วร้าย'

... ใช่แล้วฉันติดอยู่ในzsh ^โหมด (คล้ายกับของbasg !)
geekosaur

1
+1 คำตอบที่ดีฉันต้องเพิ่ม| tr "\n" "\0"ก่อนxargsบิต เห็นในโพสต์นี้: stackoverflow.com/questions/20307299/ …
Adam Plocher

5

lsอย่าแยกการส่งออกของ

ที่นี่มันง่ายมากที่จะได้เชลล์เพื่อกรองไฟล์ที่คุณต้องการ โปรดสังเกตว่ามันเป็นเชลล์ที่ขยายรูปแบบDar*ไม่ใช่rmคำสั่ง การขยายรูปแบบการดำเนินการโดยเปลือกที่เรียกว่าglobbing

rm Dar*

ในกรณีที่ซับซ้อนมากขึ้นค้นหาfindคำสั่ง


3

หากคุณต้องการกำหนดขอบเขตผลลัพธ์ของการgrepขึ้นบรรทัดใหม่แทนที่จะเป็นช่องว่างคุณสามารถระบุได้ว่าจะxargsผ่าน-dตัวเลือก

$ ls | grep '^Dar' | xargs -d '\n' rm

(ดังอธิบายในคำถามนี้ )


2

สำหรับการส่งผ่านเอาต์พุตเป็นอาร์กิวเมนต์ฉันมักจะใช้สักครู่เนื่องจากฉันไม่คุ้นเคยกับ xargs

ls | grep '^Dar' | while read line; do rm "$line";done;

นี่เป็นคนเดียวที่ทำงานในกรณีของฉัน
marbel

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