Como seus nomes de arquivo estão no formato file.00064.name.99999.end, primeiro precisamos aparar tudo, exceto nosso número. Usaremos um forloop para fazer isso.
Também precisamos dizer ao shell do Bash para usar a base 10, porque a aritmética do Bash tratará os números começando com um 0 como base 8, o que irá atrapalhar as coisas para nós.
Como um script, para ser iniciado quando no diretório que contém arquivos, 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
Ou você pode usar este comando muito longo e feio para fazer a mesma coisa:
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 as partes:
for f in ./* significa para tudo no diretório atual, faça .... Isso define cada arquivo ou diretório encontrado como a variável $ f.
if [[ -f "$f" ]]verifica se o item encontrado é um arquivo; caso contrário, saltamos para a echo "$f is not...parte, o que significa que não começamos a excluir diretórios acidentalmente.
file="${f%.*}" define a variável $ file como o nome do arquivo aparando o que vier depois da última . .
if [[ $((10#${file##*.} % 12)) -eq 0 ]]é onde a aritmética principal entra em ação. Ela ${file##*.}apara tudo antes da última .em nosso nome de arquivo sem extensão. $(( $num % $num2 ))é a sintaxe da aritmética do Bash para usar a operação de módulo, 10#no início diz ao Bash para usar a base 10, para lidar com os 0s iniciais traquinas. $((10#${file##*.} % 12))então nos deixa o restante do número de nossos nomes de arquivos dividido por 12. -ne 0verifica se o restante é "diferente de zero".
- Se o restante não for igual a 0, o arquivo será excluído com o
rmcomando, você poderá substituí-lo rmpela echoprimeira vez, para verificar se os arquivos esperados serão excluídos.
Essa solução não é recursiva, o que significa que processará apenas os arquivos no diretório atual e não entrará em nenhum subdiretório.
A ifdeclaração com o echocomando para avisar sobre diretórios não é realmente necessária, pois rm, por si só, reclamará de diretórios e não os excluirá, portanto:
#!/bin/bash
for f in ./*
do
file="${f%.*}"
if [[ $((10#${file##*.} % 12)) -ne 0 ]]; then
rm "$f"
fi
done
Ou
for f in ./* ; do file="${f%.*}"; if [[ $((10#${file##*.} % 12)) -ne 0 ]]; then rm "$f"; fi; done
Também funcionará corretamente.