Cho rằng tên tệp của bạn ở định dạng file.00064.name.99999.end
, trước tiên chúng tôi cần cắt bỏ mọi thứ trừ số của chúng tôi. Chúng tôi sẽ sử dụng một for
vòng lặp để làm điều này.
Chúng ta cũng cần nói với shell Bash sử dụng cơ sở 10, bởi vì số học Bash sẽ coi chúng là số bắt đầu bằng 0 là cơ sở 8, điều này sẽ gây rối cho chúng ta.
Là một tập lệnh, sẽ được khởi chạy khi trong thư mục chứa các tệp sử dụng:
#!/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
Hoặc bạn có thể sử dụng lệnh xấu xí rất dài này để làm điều tương tự:
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
Để giải thích tất cả các phần:
for f in ./*
có nghĩa là cho tất cả mọi thứ trong thư mục hiện tại, do .... Điều này đặt từng tệp hoặc thư mục được tìm thấy dưới dạng biến $ f.
if [[ -f "$f" ]]
kiểm tra xem mục được tìm thấy có phải là một tệp không, nếu không chúng ta bỏ qua echo "$f is not...
phần đó, điều đó có nghĩa là chúng ta không bắt đầu xóa các thư mục một cách tình cờ.
file="${f%.*}"
đặt biến $ file làm tên tệp cắt xén bất cứ thứ gì đến sau cái cuối cùng .
.
if [[ $((10#${file##*.} % 12)) -eq 0 ]]
là nơi Số học chính bắt đầu. ${file##*.}
Trims mọi thứ trước tên cuối cùng .
trong tên tệp của chúng tôi mà không cần gia hạn. $(( $num % $num2 ))
là cú pháp để số học Bash sử dụng phép toán modulo, 10#
lúc bắt đầu bảo Bash sử dụng cơ sở 10, để đối phó với các số 0 dẫn đầu phiền phức đó. $((10#${file##*.} % 12))
sau đó để lại cho chúng tôi phần còn lại của số tên tệp chia cho 12. -ne 0
kiểm tra xem phần còn lại có "không bằng" không.
- Nếu phần còn lại không bằng 0, tệp sẽ bị xóa bằng
rm
lệnh, bạn có thể muốn thay thế rm
bằng echo
khi chạy lần đầu tiên này, để kiểm tra xem bạn có xóa các tệp dự kiến không.
Giải pháp này không đệ quy, nghĩa là nó sẽ chỉ xử lý các tệp trong thư mục hiện tại, nó sẽ không đi vào bất kỳ thư mục con nào.
Các if
tuyên bố với các echo
lệnh để cảnh báo về thư mục là không thực sự cần thiết như rm
trên riêng của nó sẽ phàn nàn về thư mục, và không xóa chúng, vì vậy:
#!/bin/bash
for f in ./*
do
file="${f%.*}"
if [[ $((10#${file##*.} % 12)) -ne 0 ]]; then
rm "$f"
fi
done
Hoặc là
for f in ./* ; do file="${f%.*}"; if [[ $((10#${file##*.} % 12)) -ne 0 ]]; then rm "$f"; fi; done
Sẽ hoạt động chính xác quá.