Como remover caracteres dos nomes dos arquivos em uma pasta?

0

Eu tenho uma lista de arquivos em um diretório, mas alguns deles tem caracteres estranhos no nome. Como posso renomear apenas esses arquivos para excluir esses caracteres?

O sistema operacional do computador é o Red Hat, o charset UTF-8.

Lista de arquivos

    
por Midoes 24.11.2015 / 00:38

2 respostas

2

Tente desintoxicação. Na página de manual:

Name

detox - clean up filenames

Synopsis

detox [-hnLrv] [-s -sequence] [-f -configfile] [--dry-run] [--special] file ...

Description

The detox utility renames files to make them easier to work with. It removes spaces and other such annoyances. It'll also translate or cleanup Latin-1 (ISO 8859-1) characters encoded in 8-bit ASCII, Unicode characters encoded in UTF-8, and CGI escaped characters.

Sequences

detox is driven by a configurable series of filters, called a sequence. Sequences are covered in more detail in detoxrc(5) and are discoverable with the -L option. Some examples of default sequences are iso8859_1 and utf_8.

Está disponível nos repositórios do RHEL 6, da última vez que verifiquei. Não tenho certeza sobre o RHEL 7. Antes de fazer a limpeza real, é aconselhável executar detox com a opção -n (dry-run). Por exemplo: detox -rn /somedir .

    
por 24.11.2015 / 01:17
0

Se você não puder usar detox ou desejar mais controle sobre os novos nomes de arquivos, poderá usar ferramentas padrão.

ls com saída para o terminal mostra caracteres não imprimíveis como ? . Se o nome exibido (por exemplo, ab?cd ) for exclusivo ( ls ab?cd mostra um único arquivo), basta usar essa máscara em um comando mv :

mv ab?cd ab_cd

ls -b mostra caracteres não imprimíveis como seqüências de escape (por exemplo, abls1cd ), embora você não possa usar o nome exibido em outro comando, mas permite ver todos os arquivos afetados:

ls -b|grep '\'     ; # includes names with embedded spaces
ls -b|grep '\[^ ]' ; # excludes names with embedded spaces

$n com saída para um arquivo ou canal grava o nome do arquivo literal: nesse caso, você pode obter uma lista de nomes de arquivos com não imprimíveis com:

ls|env LC_ALL=C grep '[^!-~]' ; # includes names with embedded spaces
ls|env LC_ALL=C grep '[^ -~]' ; # excludes names with embedded spaces

Agora você pode canalizar essa saída para um script para realizar qualquer renomeação que precisar, como em:

ls|env LC_ALL=C grep '[^!-~]'|while l='line'; do ... ; mv "$l" "$n" ; done

O código omitido é para formular qualquer novo nome line que você requer. Se você não tiver while read l , poderá usar %code% , embora isso não funcione corretamente com nomes de arquivos com espaços iniciais ou finais.

    
por 24.11.2015 / 16:01