Você já forneceu um comando find
que é seguro para arquivos com nomes estranhos:
find -regextype posix-egrep -type f -regex '.*[^/]{5}' -delete
Essa regex corresponde a cinco caracteres finais que não contêm uma barra (ou seja, o nome do arquivo tem mais de cinco caracteres).
O loop de Bash que você forneceu geralmente funciona, mas provavelmente não é dimensionado com milhares de arquivos e pode quebrar com nomes de arquivos especiais.
Uma alternativa que é semelhante em eficiência, mas pode fornecer mais flexibilidade (substitua rm
por -n1 echo
para imprimir todos os arquivos):
find -type f -print0 | grep -Ez '[^/]{5}$' | xargs -0 rm
As opções -print0
, -z
e -0
garantem que cada nome de arquivo seja terminado com um byte NUL. Isso garante que os caracteres especiais não dividam nomes de arquivos (novas linhas quebram o comando Bash que você forneceu). Embora esse grep command
ainda falhe com um nome como path/abc\ndef
(onde \n
é uma nova linha), ele não será dividido em path/abc
e def
.
Como você raramente encontrará arquivos com \n
em seu nome, deixo a implementação para esse caso como um exercício para o leitor.