Dado que sus nombres de archivo están en el formato file.00064.name.99999.end
, primero necesitamos recortar todo excepto nuestro número. Usaremos un for
bucle para hacer esto.
También debemos decirle al shell de Bash que use la base 10, porque la aritmética de Bash los tratará con números que comienzan con un 0 como base 8, lo que nos complicará las cosas.
Como secuencia de comandos, que se iniciará cuando esté en el directorio que contiene archivos, use:
#!/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
O puede usar este comando feo muy largo para hacer lo mismo:
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
Para explicar todas las partes:
for f in ./*
significa para todo en el directorio actual, hacer .... Esto establece cada archivo o directorio encontrado como la variable $ f.
if [[ -f "$f" ]]
comprueba si el elemento encontrado es un archivo; de lo contrario, saltamos a la echo "$f is not...
parte, lo que significa que no comenzamos a eliminar directorios accidentalmente.
file="${f%.*}"
establece la variable $ file como el recorte del nombre de archivo de lo que viene después del último .
.
if [[ $((10#${file##*.} % 12)) -eq 0 ]]
es donde entra en acción la aritmética principal. ${file##*.}
Recorta todo antes del último .
en nuestro nombre de archivo sin extensión. $(( $num % $num2 ))
es la sintaxis para que la aritmética de Bash use la operación de módulo, 10#
al principio le dice a Bash que use la base 10, para lidiar con esos molestos ceros iniciales. $((10#${file##*.} % 12))
luego nos deja el resto de nuestro número de nombres de archivo dividido por 12. -ne 0
comprueba si el resto es "no igual" a cero.
- Si el resto no es igual a 0, el archivo se elimina con el
rm
comando, es posible que desee reemplazar rm
con echo
cuando se ejecuta por primera vez este, para comprobar que usted obtenga los archivos que se espera que desea eliminar.
Esta solución no es recursiva, lo que significa que solo procesará archivos en el directorio actual, no entrará en ningún subdirectorio.
La if
declaración con el echo
comando para advertir sobre los directorios no es realmente necesaria ya que rm
por sí sola se quejará de los directorios y no los eliminará, así que:
#!/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
Funcionará correctamente también.