ls | grep | rm - วิธีจัดรูปแบบคำสั่งนี้?


11

ฉันกำลังพยายามลบไฟล์หลายไฟล์ในไดเรกทอรีหนึ่ง (บน Mac OS X โดยใช้ Terminal)

ls | grep \([1-9]\) | xargs rm

ควรทำเคล็ดลับ แต่ไม่ได้ ฉันกำลังพยายามลบไฟล์ใด ๆ ที่มีตัวเลขหนึ่งหลักในวงเล็บในชื่อไฟล์ (ซ้ำกันที่ดาวน์โหลดจากเว็บ) แต่ท้ายที่สุดก็ทำสิ่งนี้:

> rm: 520syllabus2010: No such file or
> directory rm: (3).pdf: No such file or
> directory

เพราะมันแปลพื้นที่ไม่ถูกต้อง ควรลบ "520syllabus2010 (3) .pdf"

วิธีที่เหมาะสมในการทำเช่นนี้คืออะไร?

ขอบคุณเจฟ


1
#ชื่อไฟล์ตัวอย่างของคุณไม่ได้มีตัวอักษร
Benjamin Bannier

1
@honk: #เขาไม่ได้มองหาตัวอักษร
Ignacio Vazquez-Abrams

1
เนื่องจากการขยายตัวโดยเปลือกนี้งานจะไม่ได้ตามที่คาดว่า CWD (3)มีไฟล์ชื่อเช่น เป็นการดีที่สุดที่จะอ้างอาร์กิวเมนต์เพื่อที่เชลล์จะไม่ส่งผลกระทบต่อมัน
Ignacio Vazquez-Abrams

1
คุณกำลังโดนปัญหาตัวคั่นen.wikipedia.org/wiki/Xargs#The_separator_problem
Ole Tange

คำตอบ:


19

เวอร์ชั่นสั้น:

rm *\([1-9]\)*

อย่าท่อไปls xargsแต่ท่อfind ... -print0ไปxargs -0ในการสั่งซื้อเพื่อหลีกเลี่ยงปัญหาดังกล่าว

find . -maxdepth 1 -name '*([1-9])*' -print0 | xargs -0 rm

... ซึ่งสามารถเขียนเป็น:

find . -maxdepth 1 -name '*([1-9])*' -exec rm {} \;

และ:

find . -maxdepth 1 -name '*([1-9])*' -delete

ซึ่งสามารถย่อให้เหลือเพียงแค่rmใช้สัญลักษณ์แทน


ปกติlsและfindชื่อไฟล์ที่แยกต่างหากที่มีการขึ้นบรรทัดใหม่ แต่xargsแยกการป้อนข้อมูลของตนโดยการขึ้นบรรทัดใหม่หรือพื้นที่ที่มีผลในพฤติกรรมที่คุณเห็น

มีความเป็นไปได้ที่จะบอกxargsให้แบ่งโดยการขึ้นบรรทัดใหม่เท่านั้น แต่ไฟล์สามารถมีการขึ้นบรรทัดใหม่ในชื่อของพวกเขาด้วย ในความเป็นจริงบน Linux และ BSD ที่มีเพียง ตัวละครที่ไม่ได้รับอนุญาตเป็น"โมฆะ"หรือศูนย์ไบต์ - ดังนั้นจึงเป็นสิ่งที่คุณควรใช้ในกรณีดังกล่าว

ในตัวอย่างที่ 2 ด้านบน-print0บอกfindให้แยกชื่อไฟล์ด้วยไบต์ว่าง xargs -0สำหรับเดียวกัน (เครื่องมืออื่น ๆ อีกสองสามตัวก็มีตัวเลือกที่คล้ายกันเช่นsort -zหรือgrep -zZ)

"เวอร์ชั่นย่อ" ใช้สัญลักษณ์แทนเชลล์แบบง่าย ("รูปแบบ" ในแบบbashแมนนวล - ดูหัวข้อ "การขยายชื่อพา ธ ")


1
และเพื่อความปลอดภัยจะดีกว่าที่จะใช้*" "\\([1-9]\\).*เพื่อให้เฉพาะไฟล์ที่มีช่องว่างก่อนจำนวน paren'd ก่อนระยะเวลา (a, ถึงเที่ยงธรรม) จะถูกลบ
Ignacio Vazquez-Abrams

ไม่คุ้นเคยกับไวยากรณ์นี้มาก แต่ขึ้นอยู่กับ upvotes ที่ฉันลองและสิ่งที่คุณรู้ ... มันใช้งานได้! ขอบคุณ!
Jeff

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