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 forpę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 0sprawdza, czy reszta nie jest „równa” zero.
- Jeśli reszta nie jest równa 0, plik zostanie usunięty z
rmpoleceniem, może chcesz zamienić rmze echopodczas 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.
ifSprawozdanie z echopoleceniem, 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.