วิธี 'rm' หรือ 'mv' ช่วงของไฟล์เช่น file01.txt, file02.txt … file85.txt


23

สมมติว่าฉันมีกลุ่มไฟล์ชื่อด้วยวิธีนี้:

file01.txt file02.txt file03.txt ... file20.txt

และฉันต้องการรันคำสั่งในช่วงของไฟล์เหล่านี้

ฉันรู้ว่าถ้าต้องการ 'rm' จาก 'file05.txt' ถึง 'file09.txt' ฉันสามารถทำได้:

rm file0[5-9].txt

แต่ฉันจะ 'ช่วง' จาก file08.txt ถึง file13.txt ได้อย่างไร ฉันลองรหัสนี้

rm file[08-13].txt

และมันไม่ทำงาน ฉันสามารถเรียกใช้คำสั่งนี้:

rm file0[89].txt file1[0-3].txt

แต่ฉันอยากรู้ว่าฉันสามารถทำสิ่งนี้ได้ด้วยการโต้เถียงที่ละเอียดอ่อนกว่าเพียงเพื่อ 'rm' หากเป็นไปได้


ตอบคำถามที่เกือบเหมือนกันได้ที่นี่: stackoverflow.com/questions/25049411/…
arielf

คำตอบ:


38

คุณต้องใช้การขยายรั้งของbash:

rm file{08..13}.txt

การดำเนินการนี้จะลบไฟล์file08ไปยังfile13จะแสดงข้อความแสดงข้อผิดพลาดหากไฟล์ใด ๆ หายไป

กำหนดช่วงเพื่อตอบสนองความต้องการของคุณ


ปัญหาของโอเปอเรเตอร์ globbing []คือมันปฏิบัติต่อตัวละคร / ตัวเลขแต่ละตัวที่อยู่ภายในมันเป็นโทเค็นเดียวและดังนั้นจึงรองรับการประกาศช่วงโดยใช้หลักเดียวเท่านั้น

หากคุณยืนยันในการใช้[]คุณสามารถใช้รูปแบบที่ค่อนข้างน่าเกลียดนี้เพื่อจับคู่file08กับfile13:

rm file0[8-9].txt file1[0-3].txt

5
รั้งการขยายตัวยังเป็นประโยชน์กับเครื่องหมายจุลภาคเช่นmv foo.{txt,md}หรือcp foo.txt{,.bak}
Kos

2

เชลล์บางตัวเช่นค่าเริ่มต้นของ Ubuntu /bin/sh(ซึ่งก็คือdash) หรือ mkshไม่มีการขยายรั้งหรือในกรณีที่ksh- การขยายรั้งไม่สามารถใช้เป็นศูนย์ได้:

$ ksh -c 'echo {05..13}'
5 6 7 8 9 10 11 12 13

ในกรณีเช่นนี้เราสามารถใช้ในprintfการจัดรูปแบบหมายเลขส่วนของชื่อไฟล์และใช้ while loop เพื่อนำ c-like สำหรับพฤติกรรมลูป (หมายเหตุเพื่อแทนที่echoด้วยrmหรืออะไรก็ตามที่คุณต้องการ):

$ i=5; while [ "$i" -le 10 ]; do num=$(printf "%.2d" "$i" ); echo "file$num.txt";i=$(($i+1)); done
file05.txt
file06.txt
file07.txt
file08.txt
file09.txt
file10.txt

และนี่คือธรรมแบบพกพา - ทำงานร่วมกับdash, ksh, นอกจากนี้ยังมีmksh bashในกรณีของkshและbashเรายังสามารถใช้c-style for loop syntax (but not in case ofmksh ordash`):

$ ksh -c 'for((i=5;i<11;i++)); do num=$(printf "%.2d" "$i" ); echo "file$num.txt";done'             
file05.txt
file06.txt
file07.txt
file08.txt
file09.txt
file10.txt

โปรดทราบว่าในbashกรณีของprintfสนับสนุนการพิมพ์เป็นตัวแปรและทำให้เราสามารถทำได้printf -v num "%.2d" "$i"แทนที่จะใช้การทดแทนคำสั่ง

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