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 -n
ou --nono
para 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 rename
quenã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 -Q
adicionará aspas duplas em torno de cada nome, ou seja, fornecerá "foo*bar"
ou "foo | bar"
.
Em seguida, substitua os caracteres indesejados /tmp/new.txt
manualmente por um editor ou por sed -i -e
(ou perl -p -i -e
se preferir) ou tr
ou 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.txt
ver 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 paste
comando e altere cada linha para um mv
comando:
paste /tmp/old.txt /tmp/new.txt | sed -e 's/^/mv -n /' >/tmp/bulk-rename
O que esse paste
comando faz é pegar uma linha de /tmp/old.txt
e uma linha de /tmp/new.txt
e colocá-las juntas em uma única linha com um espaço em branco entre elas. A sed
parte adiciona um mv -n
ao início de cada uma dessas linhas. mv -n
evita 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
.