Eu tinha um disco rígido que não conseguia montar no Linux Mint e para consertar tive que ir ao Windows e fazer o chkdsk /f e:
. chkdsk corrigiu o problema, mas renomeou todos os arquivos com caracteres especiais e os moveu para um found.000
diretório. Então agora tenho que mover e renomear novamente esses arquivos como estavam antes. Se eu executar um comando de vez em quando para renomear os arquivos com caracteres especiais, posso evitar que isso aconteça novamente.
Eu quero recursivamenterenomear arquivos E DIRETÓRIOSdo diretório atual. Onovas linhasdeve ser substituídopara espaço, opersonagens < > : " \ | ? *
deveria estarremovidoou melhor ainda, substituído por caracteres semelhantes que não estão reservados e oespaçosnocomeçar e terminarde um nome de arquivo deve serremovido. Aqui está um exemplo deo que eu quero:
rename(' Fîlenämè\n\r\n$@<>:"\|?* \n ', 'Fîlenämè $@')
Aqui está o que seriamelhor ainda:
rename(' Fîlenämè\n\r\n$@<>:"\|?* \n ', 'Filename $@')
De acordo comesta respostadeveria ser algo assim:
LC_ALL=C find . -depth -execdir rename -n 's/[\r\n]+/ /g; s/:/./g; s/[\|]/-/g; s/[<>"?*]//g; s/[ \f\t\v]+$//g; s/^[ \f\t\v]+//g' {} +
Preciso ignorar o ..Trash-1000
diretório, pois este comando está me dandoERROS de entrada/saídae o comando para de funcionar. Ter um script que lide com esses erros caso haja arquivos nesse diretório que possam ser renomeados seria perfeito.
Disseram-me para limpar o ..Trash-1000
diretório como emesta resposta. Eu também dei uma olhadaEste. Mas fazer isso não está funcionando:
LC_ALL=C find . -depth -path ./..Trash-1000 -prune -o -print -execdir rename -n 's/[\r\n]+/ /g; s/:/./g; s/[\|]/-/g; s/[<>"?*]//g; s/[ \f\t\v]+$//g; s/^[ \f\t\v]+//g' {} +
E ainda não está excluindo espaços no início e no final dos nomes dos arquivos.
Eu tive que reescrever minha pergunta como a perguntaScript para substituir recursivamente caracteres inválidos em nomes de arquivos, não em diretórios, com renomeaçãonão respondeu o meu.
Responder1
Em vez de remover o diretório com erros de entrada/saída, o comando pode ser executado uma vez para cada um dos outros diretórios.
Este é o comando que usei para remover caracteres reservados do Windows:
find . -execdir rename -n 's/[\r\n]+/ /g;
s/:/./g;
s/[\|]/-/g;
s/[<>"?*]//g;
s/[ \f\t\v]+$//g;
s/^[ \f\t\v]+//g' {} \;
Ele transforma novas linhas em espaços, substitui :
, .
depois muda \|
com -
, remove <>"?*
, exclui espaços no final do nome do arquivo e faz o mesmo com espaços no início.