Biorąc pod uwagę, że twoje nazwy plików mają format file.00064.name.99999.end
, najpierw musimy skrócić wszystko oprócz naszego numeru. W tym celu użyjemy for
pętli.
Musimy także powiedzieć powłoce Bash, aby użyła bazy 10, ponieważ arytmetyka Bash potraktuje ich liczby zaczynające się od 0 jako bazę 8, co zepsuje nam wszystko.
Jako skrypt uruchamiany w katalogu zawierającym pliki należy użyć:
#!/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
Lub możesz użyć tego bardzo długiego brzydkiego polecenia, aby zrobić to samo:
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
Aby wyjaśnić wszystkie części:
for f in ./*
oznacza wszystko dla bieżącego katalogu, wykonaj .... Ustawia każdy znaleziony plik lub katalog jako zmienną $ f.
if [[ -f "$f" ]]
sprawdza, czy znaleziony element jest plikiem, jeśli nie, przechodzimy do echo "$f is not...
części, co oznacza, że nie zaczynamy przypadkowo usuwać katalogów.
file="${f%.*}"
ustawia zmienną $ file jako przycinanie nazw plików niezależnie od tego, co nastąpi po ostatnim .
.
if [[ $((10#${file##*.} % 12)) -eq 0 ]]
jest miejscem, gdzie rozpoczyna się główna arytmetyka ${file##*.}
Przycina wszystko przed ostatnim .
w naszej nazwie pliku bez rozszerzenia. $(( $num % $num2 ))
jest składnią arytmetyki Bash używającej operacji modulo, 10#
na początku mówi Bashowi, aby używał podstawy 10, aby radzić sobie z tymi irytującymi wiodącymi zerami. $((10#${file##*.} % 12))
następnie pozostawia nam resztę liczby nazw plików podzieloną przez 12. -ne 0
sprawdza, czy reszta nie jest „równa” zero.
- Jeśli reszta nie jest równa 0, plik zostanie usunięty z
rm
poleceniem, może chcesz zamienić rm
ze echo
podczas pierwszego uruchomienia to, aby sprawdzić, czy można uzyskać oczekiwane pliki do usunięcia.
To rozwiązanie nie jest rekurencyjne, co oznacza, że będzie przetwarzać tylko pliki w bieżącym katalogu, nie będzie przechodzić do żadnych podkatalogów.
if
Sprawozdanie z echo
poleceniem, aby ostrzec o katalogach nie jest naprawdę koniecznerm
na swój własny będzie narzekać katalogów, a nie je usunąć, więc:
#!/bin/bash
for f in ./*
do
file="${f%.*}"
if [[ $((10#${file##*.} % 12)) -ne 0 ]]; then
rm "$f"
fi
done
Lub
for f in ./* ; do file="${f%.*}"; if [[ $((10#${file##*.} % 12)) -ne 0 ]]; then rm "$f"; fi; done
Będzie również działać poprawnie.