Como seus nomes de arquivo estão no formato file.00064.name.99999.end
, primeiro precisamos aparar tudo, exceto nosso número. Usaremos um for
loop 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 0
verifica se o restante é "diferente de zero".
- Se o restante não for igual a 0, o arquivo será excluído com o
rm
comando, você poderá substituí-lo rm
pela echo
primeira 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 if
declaração com o echo
comando 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.