Dosya adlarınızın biçimde olduğu göz önüne alındığında, öncelikle file.00064.name.99999.end
numaramız dışındaki her şeyi kesmemiz gerekir. Bunu for
yapmak için bir döngü kullanacağız .
Ayrıca Bash kabuğuna baz 10'u kullanmasını söylemeliyiz, çünkü Bash aritmetiği onlara 0 ile başlayan sayıları taban 8 olarak ele alır, bu da bizim için işleri bozar.
Bir komut dosyası olarak, dosyaları içeren dizinde kullanıldığında başlatılacak:
#!/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
Ya da aynı şeyi yapmak için bu çok uzun çirkin komutu kullanabilirsiniz:
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
Tüm bölümleri açıklamak için:
for f in ./*
geçerli dizindeki her şey için anlamına gelir, do .... Bu $ f değişkeni olarak bulunan her dosya veya dizini ayarlar.
if [[ -f "$f" ]]
Bulunan öğenin bir dosya olup olmadığını kontrol eder, eğer echo "$f is not...
parçayı atlamazsak, dizinleri yanlışlıkla silmeye başlamıyoruz demektir.
file="${f%.*}"
$ file değişkenini, dosya adının sondan sonra ne olursa olsun kırpmasını ayarlar .
.
if [[ $((10#${file##*.} % 12)) -eq 0 ]]
ana Aritmetik devreye girer. Dosya ${file##*.}
adımızda sondan önceki her şeyi .
uzantısız keser. $(( $num % $num2 ))
Bash aritmetiğinin modulo işlemini kullanacağı sözdizimidir 10#
, başlangıçta Bash'e bu sinir bozucu 0'larla başa çıkmak için temel 10'u kullanmasını söyler. $((10#${file##*.} % 12))
sonra dosya adları numaramızın geri kalanını 12'ye -ne 0
böler. Geri kalanın sıfıra "eşit olmadığını" kontrol eder.
- Geri kalan 0'a eşit değilse, dosya ile silinir
rm
komuta, değiştirmek isteyebilirsiniz rm
ile echo
ilk beklendiği dosyaları silmek için olsun kontrol etmek için, bu çalıştırırken.
Bu çözüm özyinelemesizdir, yani yalnızca geçerli dizindeki dosyaları işleyecek, herhangi bir alt dizine girmeyecektir.
if
İle ifadesi echo
olarak dizinlere hakkında uyarmak için komuta gerçekten gerekli değildir rm
bu yüzden onları silin dizinleri şikayet ve olmayacaktır başlıbaşına:
#!/bin/bash
for f in ./*
do
file="${f%.*}"
if [[ $((10#${file##*.} % 12)) -ne 0 ]]; then
rm "$f"
fi
done
Veya
for f in ./* ; do file="${f%.*}"; if [[ $((10#${file##*.} % 12)) -ne 0 ]]; then rm "$f"; fi; done
Doğru da çalışacaktır.