ผลลัพธ์ของการค้นหาไปยัง rm


11

ฉันพยายามวิ่ง

locate *.orig | xargs rm

แต่มันบอกว่า No such file or directory

ฉันเคยเห็นวิธีที่จะทำfindแต่การค้นหาคืนค่าเส้นทางแบบเต็มไปยังวัตถุดังนั้นมันควรจะเป็นไปได้

คำตอบ:


20

หากชื่อไฟล์มีช่องว่างที่คุณควรใช้

locate -0 $something | xargs -0 rm

จากlocateหน้าคน :

-0, --nullเฉพาะกิจรายการในการส่งออกโดยใช้อักขระ ASCII NUL แทนการเขียนรายการในบรรทัดที่แยกต่างหากแต่ละ ตัวเลือกนี้ถูกออกแบบมาเพื่อการทำงานร่วมกันกับตัวเลือก --null ของ GNU xargs (1)

หรือ

locate $something | while read f; do rm "$f"; done

นอกจากนี้คุณควรป้องกัน*.origด้วยเครื่องหมายคำพูดเพื่อหลีกเลี่ยงการขยายตัวของเชลล์และส่งผ่านเพื่อหาตำแหน่งที่ไม่ถูกแตะต้อง


คุณหมายถึงอะไรโดย "การขยายตัวของเชลล์"?
soldier.moth

+1 สำหรับตัวอย่างที่สองของคุณ ฉันมักจะใช้| while readเพราะไดเรกทอรีบ้านของฉันเต็มไปด้วยไฟล์ที่มีช่องว่าง
matpie

@ Soldier.moth: หากในโฟลเดอร์ปัจจุบันมีไฟล์ที่สอดคล้องกับรูปแบบ*.origเชลล์จะขยายรูปแบบเป็นพูดfile1.orig file2.orig ...เพื่อที่locateจะไม่เห็นสตริงที่แน่นอน*.origตามที่ควร
enzotib

นอกจากนี้ยังจะ grep tr '\n' '\0'หาเอาท์พุทที่คุณสามารถแล้ว
Pablo Bianchi

2

มันxargsไม่ใช่xarg


นั่นคือสิ่งที่ฉันหมายถึงการพิมพ์คำถามจากหน่วยความจำขอบคุณ
soldier.moth

โอวตกลง. ดูเหมือนว่าข้อผิดพลาดที่คุณจะได้รับคำสั่งที่ไม่ถูกต้องหลังจาก |
maco

0

คำสั่งlocate *.orig | xargs rmใช้งานได้จริง แต่สิ่งที่เกิดขึ้นคือlocateการค้นหา*.origไฟล์ในถังขยะสามารถrmแยกแยะข้อผิดพลาดNo such file or directoryเมื่อพยายามลบไฟล์ในถังขยะ


คุณควรเพิ่มข้อมูลเป็น "ความคิดเห็น" ในคำตอบเดิมหรือคุณสามารถแก้ไขคำตอบเดิม นี่ไม่ใช่คำตอบสำหรับคำถามของคุณ
enzotib

มันเป็นคำตอบสำหรับคำถามของฉันด้วยเหตุผลที่ฉันได้รับข้อผิดพลาดเนื่องจากค้นหาพบไฟล์ * .orig ในถังขยะและ rm ไม่สามารถลบได้ ฉันยอมรับคำตอบของคุณและโหวตทั้งคำตอบอื่น ๆ เพราะพวกเขาเขียนได้ดีและอาจช่วยคนที่มาภายหลัง
soldier.moth

0

ค้นหาไม่ได้ทำ globbing แต่เปลือกทำ เชลล์ขยาย * .orig ไปเป็นสิ่งที่พบในไดเร็กทอรีปัจจุบันซึ่งตรงกับ * .orig

เพียงแค่ใช้

locate .orig

และถ้านั่นทำให้คุณได้สิ่งที่คุณต้องการ

locate .orig | xargs rm

หรือตามที่ระบุไว้ใน enzotib

locate -0 .orig | xargs -0 rm

หากคุณมีช่องว่างในชื่อไฟล์


0

เคล็ดลับ: บันทึกเส้นทางทั้งหมดในไฟล์ tmp จากนั้นวนรอบมัน:

#!/bin/bash
locate .orig /tmp/tmp.txt
while read line
do
    pth=$line
    rm "$pth" 
done < /tmp/tmp.txt

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