ทำไมเสียงก้อง * | rm -f ไม่ทำงานเหรอ


1

ทำไมecho * | rm -fไม่ทำงาน ตามความเข้าใจของฉันecho *ควรแสดงรายการไฟล์ทั้งหมดในไดเรกทอรีและไปป์ควรส่งรายการนี้เป็นอาร์กิวเมนต์ไปยังrm -fคำสั่งซึ่งควรลบไฟล์ ฉันพลาดอะไรไป


โปรดทราบecho *ว่าไม่ได้แสดงรายการไฟล์ที่ซ่อน แต่echo * .*ทำ
scai

2
@scai กับecho .*คุณจะมี.และ..ยังไม่เป็นความคิดที่ดีเลย ด้วยshopt -s dotglob, echo *จะขยายไปยังไฟล์ทั้งหมดรวมทั้งคนที่ซ่อนอยู่ แต่ไม่.ว่ามิได้..; มันจะปลอดภัยยิ่งขึ้น
gniourf_gniourf

คำตอบ:


7

ท่อส่งข้อมูลไปยัง stdin และไม่ต้องโต้แย้งรายการ นี่เป็นแนวคิดที่แตกต่างกันสองอย่าง

อาร์กิวเมนต์คือสิ่งที่อยู่ในบรรทัดหลังจากบรรทัดคำสั่ง Stdin นั้นเหมือนกับไฟล์ที่เปิดอยู่แล้วซึ่งคุณสามารถอ่านได้

โปรดทราบว่าการทำสิ่งต่าง ๆ เช่นนี้echo * | xargs rm -fเป็นความคิดที่ไม่ดีเพราะอาจทำสิ่งแปลก ๆ ในกรณีที่ไฟล์มีช่องว่างในชื่อหรือด้วย "-" ในตอนเริ่มต้น


ขอบคุณมาก. ฉันจะสำรวจทุกจุดที่คุณสัมผัส

1

ส่งผ่านเอาต์พุตecho *เป็นอาร์กิวเมนต์แทนที่จะเป็นอินพุต stdin จากไปป์

rm -f `echo *`

4
นี่เป็นความคิดที่แย่มาก ๆ พิจารณาไฟล์ชื่อ "-r." แน่นอนว่ามันจะช่วยแก้ปัญหาที่โปสเตอร์ถาม แต่การทำเช่นนี้เป็นสิ่งที่ผิดธรรมดา

@depz แล้วrm -f -- $(echo *)จะทำเคล็ดลับ (ถ้าคุณมีสมาร์ทพอrm) มิฉะนั้นrm -f $(echo ./*)จะทำ
gniourf_gniourf

@depesz เพิ่ม--เพื่อแก้ปัญหานี้ rm -f -- $(echo *)

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