การลบไฟล์เฉพาะตามชื่อไฟล์จาก terminal


13

ฉันมีไดเรกทอรีที่มีไฟล์ชื่อ

rho_0.txt
rho_5000.txt
rho_10000.txt
rho_150000.txt
rho_200000.txt

และอื่น ๆ ฉันต้องการลบสิ่งที่มีค่าเป็น 5000

ฉันพยายามต่อไปนี้: แต่ที่ทำให้ผมมีการตอบสนองprintf 'rho_%d.txt\n' $(seq 5000 10000 25000) | rmrm: missing operand

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


6
ไม่ว่าคุณจะทำสิ่งใดฉันขอแนะนำ (เพื่อความปลอดภัย) การย้ายไฟล์ที่ต้องการไปยังไดเรกทอรีจากนั้นเมื่อคุณยืนยันว่าไฟล์ที่จะถูกลบทั้งหมดอยู่ในไดเรกทอรีให้ลบไดเรกทอรี
user117529

ความปลอดภัยเป็นสิ่งสำคัญที่นี่ ฉันมักจะทดสอบสิ่งเหล่านี้ด้วยlsก่อน
ชาวสกอต

คำตอบ:


49

Bash Shell Brace Expansionคุณไม่จำเป็นต้องห่วงหรือคำสั่งพิเศษที่คุณมี

rm -f rho_{0..200000..5000}.txt

คำอธิบาย : {start..end..step}. การ-fละเว้นการพร้อมท์บนไฟล์ที่ไม่มีอยู่


ป.ล. เพื่อความปลอดภัยและตรวจสอบไฟล์ที่จะถูกลบโปรดทำการทดสอบครั้งแรกกับ:

ls -1 rho_{0..200000..5000}.txt

13

rmไม่อ่านจากอินพุตมาตรฐาน คุณสามารถทำได้:

for i in $(seq 5000 5000 25000); do
    rm -i rho_${i}.txt
done

ฉันรวม-iตัวเลือกในrmการแจ้งก่อนการลบเพื่อให้คุณสามารถตรวจสอบพฤติกรรม เมื่อคุณมั่นใจว่ากำลังทำสิ่งที่คุณต้องการคุณสามารถละเว้นตัวเลือกนั้นได้

แก้ไข: อีกวิธีหนึ่งคุณสามารถทำ:

for ((i = 5000; i <= 25000; i += 5000)); do
    rm -i rho_${i}.txt
done

แบบฟอร์มนั้นอาจคุ้นเคยมากขึ้นหากคุณทำการเขียนโปรแกรมใด ๆ


12

คุณไม่สามารถไพพ์ไปที่โปรแกรมราวกับว่าเนื้อหาของไพพ์เป็นอาร์กิวเมนต์ มันถูกส่งผ่าน stdin

คุณควรใช้ xarg เพื่อจุดประสงค์นี้:

printf 'rho_%d.txt\n' $(seq 5000 10000 25000) | xargs rm 

แต่ก่อนอื่นคุณสามารถลองใช้เสียงก้องเพื่อดูว่าทุกอย่างเป็นไปตามที่คุณต้องการหรือไม่:

printf 'rho_%d.txt\n' $(seq 5000 10000 25000) | xargs echo

หากรุ่นของคุณseqมีตัวเลือก-f/ --formatคุณสามารถใช้สิ่งนั้นแทนการแก้ไขด้วยการprintfแทนที่คำสั่ง
David Foerster

ขอบคุณฉันเพิ่งตอบโดยใช้คำสั่งที่ใช้ในคำถามและพยายามอธิบายข้อผิดพลาด rm ของเขา
M4rty

9

มีคนแก้ไขฉันถ้าฉันผิด แต่ถ้าไฟล์ทั้งหมดที่ขึ้นต้นด้วยrho_เป็นของแบบฟอร์มนี้มันไม่เทียบเท่าที่จะทำ

rm rho_0.txt rho_*[05]000.txt

เนื่องจากตัวเลข (นอกเหนือจาก 0) คือผลคูณของ 5,000 ถ้าและจะลงท้ายด้วย 0000 หรือ 5,000

(0 เป็นกรณีพิเศษเนื่องจากมันเป็นผลคูณของ 5,000 แต่โดยทั่วไปแล้วจะเขียนโดยไม่มีศูนย์นำหน้าเพิ่มเติมหากคุณไม่ต้องการรวม 0 ให้นำออกจากบรรทัดด้านบน)

แน่นอนว่าสิ่งนี้ควรใช้ต่อเมื่อrho_*.txtไฟล์ทั้งหมดในไดเรกทอรีของคุณมีรูปแบบที่ต้องการ rho_please_dont_delete_me_5000.txtอย่าใช้มันหากไดเรกทอรีของคุณนอกจากนี้ยังมี

(หมายเหตุคณิตศาสตร์: สิ่งนี้ทำงานได้อย่างถูกต้องเพราะปัจจัยสำคัญทั้งหมดของ 5000 คือ 2 และ 5 เป็นปัจจัยสำคัญของฐานที่เราทำงานอยู่ 10. เท่ากันมีกำลังมากพอที่ 10 (คือ 10,000) ซึ่งเป็น หารด้วย 5000 ได้ไม่มีเคล็ดลับคล้ายกันสำหรับการจับคู่ทั้งหมดที่มีทวีคูณเป็น 3000)


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