Linux: Como posso excluir todos os arquivos cujo nome de arquivo tenha mais de X caracteres?

2

Desejo excluir todos os arquivos no diretório atual e nos subdiretórios cujo nome de arquivo é maior que um tamanho específico.

Existe uma maneira fácil de fazer isso do bash?

    
por Kitsos 15.01.2014 / 13:52

2 respostas

3

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.

    
por 16.01.2014 / 11:07
4

Você pode usar find para localizar todos os arquivos no diretório e nos subdiretórios atuais e, em seguida, medir o tamanho do nome do arquivo usando o bash e excluir de acordo:

$ find . -type f | while IFS= read -r file; do 
    ## find will return the full path, strip the
    ## path from the file name. 
    name=$(basename "$file"); 
    ## Check the name'slength and delete if > 5
    [ "${#name}" -gt 5 ] && rm "$file"; 
  done

Como alternativa, você pode fazer tudo de find usando -regex e -delete . Por exemplo, para excluir o nome do arquivo com mais de 5 caracteres (excluindo o caminho):

find . -type f -regextype posix-egrep -regex '.*[^/]{5}' -delete
    
por 15.01.2014 / 14:15