Mengingat nama file Anda dalam format file.00064.name.99999.end
, pertama-tama kami harus memangkas semuanya kecuali nomor kami. Kami akan menggunakan for
loop untuk melakukan ini.
Kita juga perlu memberi tahu shell Bash untuk menggunakan basis 10, karena aritmatika Bash akan memperlakukan mereka angka yang dimulai dengan 0 sebagai basis 8, yang akan mengacaukan segalanya bagi kita.
Sebagai skrip, untuk diluncurkan ketika dalam direktori yang berisi file gunakan:
#!/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
Atau Anda dapat menggunakan perintah jelek yang sangat panjang ini untuk melakukan hal yang sama:
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
Untuk menjelaskan semua bagian:
for f in ./*
berarti untuk semua yang ada di direktori saat ini, lakukan .... Ini menetapkan setiap file atau direktori yang ditemukan sebagai variabel $ f.
if [[ -f "$f" ]]
memeriksa apakah item yang ditemukan adalah file, jika tidak kita lewati ke echo "$f is not...
bagian tersebut, yang berarti kita tidak mulai menghapus direktori secara tidak sengaja.
file="${f%.*}"
menetapkan variabel $ file sebagai nama file yang memotong apa pun yang muncul setelah yang terakhir .
.
if [[ $((10#${file##*.} % 12)) -eq 0 ]]
Di sinilah aritmatika utama dimulai. ${file##*.}
Trim semuanya sebelum yang terakhir .
dalam nama file kami tanpa ekstensi. $(( $num % $num2 ))
adalah sintaks untuk aritmatika Bash untuk menggunakan operasi modulo, 10#
pada awalnya memberitahu Bash untuk menggunakan basis 10, untuk berurusan dengan 0s terkemuka yang sial itu. $((10#${file##*.} % 12))
kemudian meninggalkan sisa nomor nama file kami dibagi dengan 12. -ne 0
memeriksa apakah sisanya "tidak sama" dengan nol.
- Jika sisanya tidak sama dengan 0, file dihapus dengan
rm
perintah, Anda mungkin ingin mengganti rm
dengan echo
saat pertama kali menjalankan ini, untuk memeriksa apakah Anda mendapatkan file yang diharapkan untuk dihapus.
Solusi ini non-rekursif, artinya hanya akan memproses file dalam direktori saat ini, tidak akan masuk ke sub-direktori.
The if
pernyataan dengan echo
perintah untuk memperingatkan tentang direktori tidak benar-benar diperlukan karena rm
pada itu sendiri akan mengeluh tentang direktori, dan tidak menghapusnya, sehingga:
#!/bin/bash
for f in ./*
do
file="${f%.*}"
if [[ $((10#${file##*.} % 12)) -ne 0 ]]; then
rm "$f"
fi
done
Atau
for f in ./* ; do file="${f%.*}"; if [[ $((10#${file##*.} % 12)) -ne 0 ]]; then rm "$f"; fi; done
Akan bekerja dengan benar juga.