เนื่องจากชื่อไฟล์ของคุณอยู่ในรูปแบบfile.00064.name.99999.end
ก่อนอื่นเราต้องตัดทุกอย่างยกเว้นหมายเลขของเรา เราจะใช้for
วงวนเพื่อทำสิ่งนี้
เราต้องบอกให้ Bash shell ใช้ base 10 เพราะเลขคณิตของ Bash จะปฏิบัติกับตัวเลขที่ขึ้นต้นด้วย 0 เป็นฐาน 8 ซึ่งจะทำสิ่งต่าง ๆ ให้เรา
ในฐานะที่เป็นสคริปต์ที่จะเปิดตัวเมื่ออยู่ในไดเรกทอรีที่มีไฟล์ใช้:
#!/bin/bash
for f in ./*
do
if [[ -f "$f" ]]; then
file="${f%.*}"
if [[ $((10#${file##*.} % 12)) -ne 0 ]]; then
rm "$f"
fi
else
echo "$f is not a file, skipping."
fi
done
หรือคุณสามารถใช้คำสั่งนี้น่าเกลียดนานมากที่จะทำสิ่งเดียวกัน:
for f in ./* ; do if [[ -f "$f" ]]; then file="${f%.*}"; if [[ $((10#${file##*.} % 12)) -ne 0 ]]; then rm "$f"; fi; else echo "$f is not a file, skipping."; fi; done
เพื่ออธิบายชิ้นส่วนทั้งหมด:
for f in ./*
หมายความว่าทุกอย่างในไดเรกทอรีปัจจุบันทำ .... ชุดนี้แต่ละไฟล์หรือไดเรกทอรีที่พบว่าเป็นตัวแปร $ f
if [[ -f "$f" ]]
ตรวจสอบว่ารายการที่พบเป็นไฟล์หรือไม่หากไม่เราข้ามไปที่echo "$f is not...
ส่วนซึ่งหมายความว่าเราจะไม่เริ่มลบไดเรกทอรีโดยไม่ตั้งใจ
file="${f%.*}"
กำหนดตัวแปร $ .
ไฟล์เป็นชื่อไฟล์ตัดออกจากสิ่งที่เกิดขึ้นหลังจากที่ล่าสุด
if [[ $((10#${file##*.} % 12)) -eq 0 ]]
เป็นที่ซึ่งเลขคณิตหลักเตะเข้ามา${file##*.}
จดจ้องทุกอย่างก่อนนามสกุล.
ในชื่อไฟล์ของเราโดยไม่มีนามสกุล $(( $num % $num2 ))
เป็นไวยากรณ์สำหรับ Bash เลขคณิตเพื่อใช้การดำเนินการ modulo ใน10#
ตอนเริ่มต้นบอกให้ Bash ใช้ฐาน 10 เพื่อจัดการกับ 0s ที่น่ารำคาญเหล่านั้น $((10#${file##*.} % 12))
จากนั้นปล่อยให้เราเหลือชื่อไฟล์ของเราหารด้วย 12 -ne 0
ตรวจสอบว่าส่วนที่เหลือคือ "ไม่เท่ากับ" ถึงศูนย์
- หากส่วนที่เหลือไม่เท่ากับ 0 ไฟล์จะถูกลบด้วย
rm
คำสั่งคุณอาจต้องการแทนที่rm
ด้วยecho
เมื่อใช้งานครั้งแรกเพื่อตรวจสอบว่าคุณได้รับไฟล์ที่คาดว่าจะลบ
โซลูชันนี้ไม่เรียกซ้ำซึ่งหมายความว่าจะประมวลผลไฟล์ในไดเรกทอรีปัจจุบันเท่านั้นจะไม่เข้าไปในไดเรกทอรีย่อยใด ๆ
if
คำสั่งกับecho
คำสั่งการเตือนเกี่ยวกับไดเรกทอรีไม่จำเป็นจริงๆเป็นrm
เป็นของตัวเองจะบ่นเกี่ยวกับไดเรกทอรีและไม่ลบพวกเขาดังนั้น:
#!/bin/bash
for f in ./*
do
file="${f%.*}"
if [[ $((10#${file##*.} % 12)) -ne 0 ]]; then
rm "$f"
fi
done
หรือ
for f in ./* ; do file="${f%.*}"; if [[ $((10#${file##*.} % 12)) -ne 0 ]]; then rm "$f"; fi; done
จะทำงานอย่างถูกต้องเช่นกัน