remova certos caracteres especiais dos nomes de arquivos

remova certos caracteres especiais dos nomes de arquivos

Estou tendo problemas para transferir pastas para meu disco rígido externo – não quero alterar a formatação do HD.

Portanto, há centenas de arquivos na pasta, e o erro que me impede de copiá-los vem de caracteres especiais (não sei exatamente quais, mas acredito que sejam "|" e "." e tenho certeza de que existem outros. Eu' Eu os renomeei/removi manualmente, mas é uma dor.

Aberto a sugestões, mas "acho" que estou procurando uma maneira de remover esses caracteres específicos do nome do arquivo (isso causaria um problema com .m4a etc?) ou substituí-los por um sublinhado, se necessário. A única pista que tenho é renomear Perl, mas ainda não tentei isso.

renomear 'y/|/_/' * assim?

obrigado por qualquer sugestão

Responder1

Sim, o comando (baseado em Perl) renameé um bom candidato para isso. Você pode adicionar a opção -nou --nonopara testar as substituições, por exemplo:

   -n, --nono
           No action: print names of files to be renamed, but don't rename.

então por exemplo

$ rename -n 'y/|./__/' *\|*
rename(foo|bar.baz, foo_bar_baz)
rename(foo|bar|baz, foo_bar_baz)

Observe renamequenãopermitem sobrescrever arquivos de forma destrutiva se seus nomes não forem exclusivos:

$ rename -v 'y/|./__/' *\|*
foo|bar.baz renamed as foo_bar_baz
foo|bar|baz not renamed: foo_bar_baz already exists

Observe que .énãoum caractere especial no contexto de nomes de arquivos, então sugiro não substituí-lo.

Responder2

Em geral, mmvé ótimo para tarefas de renomeação em massa.

Mas neste caso específico, eu seguiria um caminho completamente diferente: gerar um script de shell com alguns comandos de shell, dar uma olhada nele se é realmente o que eu quero e, em seguida, executá-lo.

Esboço aproximado:

ls -Q >/tmp/old.txt
cp /tmp/old.txt /tmp/new.txt

ls -Qadicionará aspas duplas em torno de cada nome, ou seja, fornecerá "foo*bar"ou "foo | bar".

Em seguida, substitua os caracteres indesejados /tmp/new.txtmanualmente por um editor ou por sed -i -e(ou perl -p -i -ese preferir) ou trou tr -d. Importante:não altere a ordem desse arquivo e não exclua ou adicione nenhuma linha!

De qualquer forma, dê uma boa olhada para /tmp/new.txtver se é realmente assim que você deseja que os novos nomes sejam.

Verifique se há nomes duplicados! ( sort /tmp/new.txt | uniq -r) Certifique-se de que não haja duplicatas e, se houver, edite essa linha manualmente para obter um nome exclusivo.

Em seguida, junte os arquivos com o pastecomando e altere cada linha para um mvcomando:

paste /tmp/old.txt /tmp/new.txt | sed -e 's/^/mv -n /' >/tmp/bulk-rename

O que esse pastecomando faz é pegar uma linha de /tmp/old.txte uma linha de /tmp/new.txte colocá-las juntas em uma única linha com um espaço em branco entre elas. A sedparte adiciona um mv -nao início de cada uma dessas linhas. mv -nevita a substituição de um arquivo existente.

Esse arquivo agora contém muitas linhas como

mv -n "foo" "bar"
mv -n "abc" "def"

Olhe o arquivo novamente e, quando tiver certeza de que é isso que deseja, execute-o com sh /tmp/bulk-rename.

informação relacionada