Como limpar nomes de arquivos em lote contendo caracteres inválidos

1

Eu tenho um diretório maior com arquivos cujos nomes de arquivo contêm caracteres especiais, como quebras de linha. A origem desses caracteres é aparentemente que eu copiei e colei o texto de dentro de arquivos PDF (títulos e nomes de autores) para a caixa de diálogo 'salvar como' de leitores de PDF, ignorando que eles continham esses caracteres inválidos. Com ls ou um gerenciador de arquivos não vejo os caracteres especiais, mas sua presença me impede de copiá-los ou renomeá-los. Então, como recursivamente renomear os arquivos removendo todos os caracteres inválidos? Note que eu não quero remover caracteres utf8 regulares, como trema, espaços, etc.

    
por highsciguy 04.02.2014 / 16:31

2 respostas

1

O caminho aberto:

#!/usr/bin/perl

opendir(DIR,".") or die "$@:$!";
while ($in = readdir(DIR)) {
  next unless -f $in;
  ($out = $in) =~ s/[^a-zA-Z0-9._-]//g;
  warn "$@:$!" unless rename $in, $out;
}
closedir(DIR);

O regex filtra apenas a-zA-Z ... (também pode ser [: print:] para caracteres imprimíveis) como caracteres válidos. Não há verificação de nomes de alvos vazios.

    
por 04.02.2014 / 19:00
2

com zsh :

autoload zmv
zmv -n '(**/)(*)' '$1${2//[^[:print:]]}'

(remova o -n quando feliz). Se você quiser incluir arquivos ocultos (e procurar em diretórios ocultos):

zmv -Qn '(**/)(*)(D)' '$1${2//[^[:print:]]}'

Isso remove os caracteres não imprimíveis em sua localidade.

    
por 04.02.2014 / 17:04