วิธีอ้างอาร์กิวเมนต์ด้วย xargs


15

สมมติว่าฉันต้องการลบไฟล์ทั้งหมดในโฟลเดอร์ที่มีขนาดใหญ่กว่า 1 MB

$ find . -size +1M | xargs -0 rm

นี่จะไม่ลบไฟล์ที่มีพื้นที่ว่างในชื่อ rmดังนั้นผมจึงต้องการที่จะพูดขัดแย้งทั้งหมดส่งไปยัง ถ้าfindให้มันSome report.docxมันควรจะผ่านไป"Some report.docx"rm

ฉันจะทำสิ่งนั้นได้อย่างไร


1
คุณควรอ่านmywiki.wooledge.org/UsingFind?highlight=%28xargs%29xargsก่อนที่จะทำอะไรกับ ยังเป็นที่วิกิพีเดียที่แสดงให้เห็นไม่ได้ใช้xargsโดยไม่ต้องผ่านการ-print0 find
Valentin Bajrami


ใช้xargs -d$'\n'เพื่อ จำกัด ตัวคั่นไปยังบรรทัดใหม่เท่านั้น (และไม่เว้นช่องว่างนี่จะไม่ประมวลผลคำพูดและอื่น ๆ เป็นพิเศษ - ฉันได้ตรวจสอบระบบ GNU แล้ว) - คำตอบที่ให้ไว้ในstackoverflow.com/a/33528111/94687
imz - Ivan Zakharyaschev

คำตอบ:


13

ใช้ง่าย:

find . -size +1M -delete

หากคุณยืนยันการใช้xargsและrmด้วยfindเพียงเพิ่ม-print0ในคำสั่งของคุณ:

find . -size +1M -print0 | xargs -r0 rm --

วิธีอื่น ๆ :

find . -size +1M -execdir rm -- {} +

จากman find:

-print0
    True; print the full file name on the standard output, followed by a null 
character (instead of the newline character that -print uses). This allows file names 
that contain newlines or other types of white space to be correctly interpreted by 
programs that process the find output. This option corresponds to the -0 option of 
xargs.

3
วิธีนี้จะช่วยแก้ปัญหา แต่การอ้างถึงข้อโต้แย้งจะเป็นประโยชน์ในกรณีอื่น ๆ ดังนั้นฉันจะรอคำตอบอื่น ๆ +1 สำหรับวิธีแก้ปัญหาง่ายๆ
Kshitiz Sharma

2
@KshitizSharma ไม่คุณไม่ต้องการส่ง"Some report.docx"ต่อrmเว้นแต่ชื่อไฟล์จะมีเครื่องหมายคำพูด สิ่งที่คุณต้องการคือการส่งผ่านไปยังไม่ได้รับอันตรายSome report.docx rmคำตอบ KasiyA (ปัจจุบัน) findแสดงให้เห็นวิธีการทั่วไปในการทำเช่นนั้นด้วย [KasiyA: ขออภัยที่ ping ผิดก่อนหน้านี้]
Gilles 'หยุดความชั่วร้าย'

แก้ไข @Gilles ในทุบตีฉันมักจะพูดสตริงที่จะผ่านมันไม่ได้รับอันตราย ดังนั้นโดยการอ้างถึงสิ่งที่ฉันหมายถึงคือการส่งชื่อไฟล์เป็นอาร์กิวเมนต์เดียวเพื่อ RM แทนการแยกออกเป็น$0และ$1อื่น ๆ
Kshitiz Sharma

ใน OSX ฉันทำแทนxargs -0 xargs -r0
Rolf

8

ตัวเลือก-0ของxargsหมายความว่าการส่งออกจากท่อถูกตีความว่าเป็นโมฆะยกเลิกรายการ find ... -print0ในกรณีเช่นนี้คุณยังจำเป็นต้องสร้างการป้อนข้อมูลสำหรับท่อด้วย


6

ฉันมีข้อกำหนดที่คล้ายกันและลงเอยด้วยการใช้-Iสวิตช์เพื่อมีตัวยึดตำแหน่งและฉันก็สามารถพูดได้

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