Dato che i nomi dei file sono nel formato file.00064.name.99999.end
, dobbiamo prima tagliare tutto tranne il nostro numero. Useremo un for
loop per fare questo.
Dobbiamo anche dire alla shell Bash di usare la base 10, perché l'aritmetica di Bash tratterà i loro numeri che iniziano con uno 0 come base 8, il che ci rovinerà le cose.
Come script, per essere avviato quando nella directory contenente i file utilizzare:
#!/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
Oppure puoi usare questo brutto comando molto lungo per fare la stessa cosa:
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
Per spiegare tutte le parti:
for f in ./*
significa per tutto nella directory corrente, fare .... Questo imposta ogni file o directory trovato come variabile $ f.
if [[ -f "$f" ]]
controlla se l'elemento trovato è un file, altrimenti passiamo alla echo "$f is not...
parte, il che significa che non iniziamo a cancellare accidentalmente le directory.
file="${f%.*}"
imposta la variabile $ file come nome del file eliminando tutto ciò che viene dopo l'ultimo .
.
if [[ $((10#${file##*.} % 12)) -eq 0 ]]
è qui che entra in gioco l'aritmetica principale. ${file##*.}
Taglia tutto prima dell'ultimo .
nel nostro nome file senza estensione. $(( $num % $num2 ))
è la sintassi per l'aritmetica di Bash per usare l'operazione modulo, 10#
all'inizio dice a Bash di usare la base 10, per gestire quei fastidiosi 0 iniziali. $((10#${file##*.} % 12))
poi ci lascia il resto del nostro numero di nomi di file diviso per 12. -ne 0
controlla se il resto è "non uguale" a zero.
- Se il resto non è uguale a 0, il file viene eliminato con il
rm
comando, è possibile sostituirlo rm
con echo
quando lo si esegue per la prima volta, per verificare di ottenere i file previsti da eliminare.
Questa soluzione non è ricorsiva, il che significa che elaborerà solo i file nella directory corrente, non andrà in nessuna sottodirectory.
L' if
affermazione con il echo
comando per avvisare delle directory non è davvero necessaria poiché rm
da sola si lamenterà delle directory e non li cancellerà, quindi:
#!/bin/bash
for f in ./*
do
file="${f%.*}"
if [[ $((10#${file##*.} % 12)) -ne 0 ]]; then
rm "$f"
fi
done
O
for f in ./* ; do file="${f%.*}"; if [[ $((10#${file##*.} % 12)) -ne 0 ]]; then rm "$f"; fi; done
Funzionerà anche correttamente.