ฉันต้องการลบรายการไฟล์และขอให้ยืนยัน รายการอยู่ในlist.txt
ไฟล์ ทำไมคำสั่งต่อไปนี้ทำงานไม่ถูกต้อง
while read i; do rm -i $i; done < list.txt
คำสั่งก่อนหน้าไม่รอฉัน แต่โชคดีที่ไม่มีไฟล์ถูกลบ
ฉันกำลังใช้ Bash
ฉันต้องการลบรายการไฟล์และขอให้ยืนยัน รายการอยู่ในlist.txt
ไฟล์ ทำไมคำสั่งต่อไปนี้ทำงานไม่ถูกต้อง
while read i; do rm -i $i; done < list.txt
คำสั่งก่อนหน้าไม่รอฉัน แต่โชคดีที่ไม่มีไฟล์ถูกลบ
ฉันกำลังใช้ Bash
คำตอบ:
rm -i
อ่านคำตอบจากอินพุตมาตรฐานซึ่งรับมาจากwhile
ลูป ดังนั้นจะมีการใช้บรรทัดข้อความlist.txt
เป็นคำตอบของ "ลบจริงๆหรือ" คำถาม. ในการแก้ไขคุณจะต้องแยกแหล่งอินพุตสองแหล่ง วิธีที่ง่ายที่สุดคือการread
รับอินพุตจากตัวให้คำอธิบายไฟล์แยกต่างหาก:
while IFS= read <&3 -r i; do
rm -i -- "$i" # Quote the file name, not just to be safe,
# but because it's the right syntax.
done 3< list.txt
คุณไม่ได้เปลี่ยนเส้นทางอินพุตมาตรฐาน (fd 0) อีกต่อไปสำหรับ while loop ดังนั้นrm
จะอ่านจากเทอร์มินัลตามต้องการ
หรือคุณอาจทำ:
IFS=$'\n' # set field separator to newline
set -f # disable globbing upon command substitution
rm -i -- $(cat list.txt)
หรือด้วย GNU xargs:
xargs -rd '\n' --arg-file=list.txt rm -i --
y
แต่ชื่อใด ๆ y
เริ่มต้นด้วย เห็นได้ชัดว่าrm
เพียงแค่ดูตัวละครแรกของสิ่งที่ได้รับการตอบสนอง: 'y' คือใช่ไม่มีอะไรอื่น
สำหรับบางสิ่งที่นักเล่นกว่าตอบใช่หรือไม่ใช่สำหรับแต่ละไฟล์คุณสามารถใช้iselect
สำหรับการเลือกแบบ ncurses แบบอินเทอร์แอคทีฟ เช่น
iselect -a -m < list.txt | xargs -d '\n' -r echo rm
หรืออนุญาตการเลือกไฟล์ใน dir ปัจจุบัน:
find . -maxdepth 1 -type f | iselect -a -m | xargs -d '\n' -r echo rm
ซึ่งจะแสดงรายการแบบเต็มหน้าจอ (เทอร์มินัลแบบเต็ม) ซึ่งสามารถเลือกและยกเลิกการเลือกไฟล์ได้โดยการกด SPACE กด ENTER เพื่อยอมรับการเลือกของคุณ (รายการที่เลือกจะถูกพิมพ์ใน stdout) หรือq
เพื่อออกจาก (ไม่มีสิ่งใดพิมพ์ไปยัง stdout) กดh
เพื่อขอความช่วยเหลือ
สังเกตecho rm
- ฉันได้เขียนแบบนั้นเพื่อการทดสอบ เปลี่ยนเป็นเพียงแค่rm
คุณมั่นใจว่าคุณเข้าใจในสิ่งที่กำลังทำอยู่
นอกจากนี้โปรดทราบว่าxargs
มีการใช้ที่นี่พร้อม\n
เป็นตัวคั่นอินพุต สิ่งนี้จะไม่ทำงานหากชื่อไฟล์ใด ๆ มีตัวอักษรป้อนบรรทัดอยู่ สำหรับเรื่องนั้นการiselect
ทำงานไม่ถูกต้อง - คาดว่าหนึ่งรายการต่อบรรทัด - โชคiselect
ไม่ดีที่ไม่มีตัวเลือกสำหรับอินพุตหรือเอาต์พุตที่สิ้นสุดด้วยค่า null
iselect
ได้รับการบรรจุสำหรับเดเบียนอาจเป็น Ubuntu และ distros อื่น ๆ ด้วย หน้าแรกอยู่ที่http://www.ossp.org/pkg/tool/iselect/
y
ก่อนหน้านี้จะถูกลบ?