script para alterar caracteres estranhos para underline

159 views
Skip to first unread message

Renato Rudnicki

unread,
Mar 23, 2009, 4:58:31 PM3/23/09
to slack-u...@googlegroups.com
pessoal, alguem conhece algum script que converte caracteres estranhos no linux para underline, ou hífen, ou algo parecido. Preciso disso, pois tenho um server com vários arquivos que estão com caracteres estranhos, e com isso, não consigo fazer backup destes arquivos.


--
[]'s,
Renato

Inteligência tem limite, mas burrice é infinita.

http://br.youtube.com/profile?user=renatorudnicki&view=playlists

max

unread,
Mar 24, 2009, 10:16:05 AM3/24/09
to slack-u...@googlegroups.com
2009/3/23 Renato Rudnicki <renato....@gmail.com>:

> pessoal, alguem conhece algum script que converte caracteres estranhos no
> linux para underline, ou hífen, ou algo parecido. Preciso disso, pois tenho
> um server com vários arquivos que estão com caracteres estranhos, e com
> isso, não consigo fazer backup destes arquivos.

Que tipo de caractere? Dependendo do que se trata tu pode simplesmente
escapar este caractere ou colocar o nome dos arquivos entre aspas.

Psycho Mantys

unread,
Mar 24, 2009, 6:36:30 AM3/24/09
to slack-u...@googlegroups.com


2009/3/23 Renato Rudnicki <renato....@gmail.com>
##################################################################################

Tipo, codificação estranha? Ou caracteres estranhos tipo "chines-misturado-com-turco"?

Primeiro, você tentou montar a partição com as flags corretas e legais? tipo: utf8, nls ou uni_xlate ?

Segundo, fiz um script para converter nomes em uma codificação estranha para normal. Tipo iso para utf8. Se seu problema for esse, posso lhe passar esse script.


--
Adote um pinguim, saiba como! Me mande um e-mail demonstrando interesse!

Mi blog eres su blog: https://www.lccv.ufal.br/~psycho/
http://www.slackware.com
U.L. : 450347
Fnord

Wagner Brasileiro

unread,
Mar 24, 2009, 1:38:10 PM3/24/09
to slack-u...@googlegroups.com
Explica melhor seu problema pois não entendi, independentemente de qual caracter ele contenha no nome se está adicionando com um LS por exemplo ele não se importa com os nomes dos caracteres, tente usar redirecionamento. Caso contrário use uma ER (Expressão Regular) algo do tipo ![A-Za-z1-9], põe isso dentro de um loop e troque os caracteres, mas creio que seu problema não seja de nomenclatura de fato. Outra coisa, é importante "escapar o nome do arquio", isso talvez seja de fato o seu problema, se contiver espaços o shell vai interpretar como arquivos diferentes. Ah, voltando ao script o comando FIND tem a opção de usar ER, teoricamente poderia usar a opção OK ou EXEC para renomeá-los mas se os resultados forem muitos vai dar estouro de pilha, logo terá que jogar os resultados para o XARGS num loop manual dentro de um script ou simplesmente use "for ARQ in *" para testar dentro desse loop todos os arquivos do diretório corrente e teste ARQ qaunto a ter ou não caracter extranho com a ER acima e renomeie-os, provavelmente seria legal colocar nomes seqüenciais numéricos neles, a menos que isso vá atrapalhar por ter mudado seus nomes originais, mas neste caso não poderia ter os renomeado. QQ dúvida qaunto ao script é só escrever.
 


 
2009/3/23 Renato Rudnicki <renato....@gmail.com>

renator

unread,
Mar 24, 2009, 3:59:12 PM3/24/09
to Slackware Users Group - Brazil
esses tipos de caracteres: ñß¢Ð£Øø§µÝý¥¹²³ por exemplo.

Consegui adaptar um script, para alterar nomes com esses tipos de
caracteres para hifen, mas nao consegui configurar o script para
trabalhar recursivamente. Atualmente, o script esta desta forma:

for f in *; do
new=`echo $f | tr "àá|âãäåèéêëìíîïòóôõöùúûüçñß¢Ð£Øø§µÝý¥¹²³~?
áÁéÉíÍóÓúÚâÂêÊôÔãÃõÕàÀòÒâð£þ®§ü" "-"`
if [ "$f" != "$new" ]; then
mv "$f" "$new"
fi
done


Se alguem puder me ajudar a fazer o script trabalhar recursivamente ou
tiver outra sugestão, eu agradeço.

[]'s,
Renato

On 24 mar, 14:38, Wagner Brasileiro <wagner.brasile...@gmail.com>
wrote:
> Explica melhor seu problema pois não entendi, independentemente de qual
> caracter ele contenha no nome se está adicionando com um LS por exemplo ele
> não se importa com os nomes dos caracteres, tente usar redirecionamento.
> Caso contrário use uma ER (Expressão Regular) algo do tipo ![A-Za-z1-9], põe
> isso dentro de um loop e troque os caracteres, mas creio que seu problema
> não seja de nomenclatura de fato. Outra coisa, é importante "escapar o nome
> do arquio", isso talvez seja de fato o seu problema, se contiver espaços o
> shell vai interpretar como arquivos diferentes. Ah, voltando ao script o
> comando FIND tem a opção de usar ER, teoricamente poderia usar a opção OK ou
> EXEC para renomeá-los mas se os resultados forem muitos vai dar estouro de
> pilha, logo terá que jogar os resultados para o XARGS num loop manual dentro
> de um script ou simplesmente use "for ARQ in *" para testar dentro desse
> loop todos os arquivos do diretório corrente e teste ARQ qaunto a ter ou não
> caracter extranho com a ER acima e renomeie-os, provavelmente seria legal
> colocar nomes seqüenciais numéricos neles, a menos que isso vá atrapalhar
> por ter mudado seus nomes originais, mas neste caso não poderia ter os
> renomeado. QQ dúvida qaunto ao script é só escrever.
>
> 2009/3/23 Renato Rudnicki <renato.rudni...@gmail.com>

Wagner Brasileiro

unread,
Mar 25, 2009, 8:37:46 AM3/25/09
to slack-u...@googlegroups.com
Psycho,

Poderia enviar seu script para meu e-mail para eu analisar sua lógica, pois não me vem na cabeça como proceder para renomear os arquivos sem ter problemas, a princípio estou fazendo um "ls" que passa para um "sed" e dentro de um "for" ele vai trocando um a um cada caracter do nome do arquivo por um outro caracter qualquer a minha escolha. Funciona, mas não existe um critério bem definito qaunto a renomeção dos mesmos e segundo o Júlio César Neves com quem estudei Shell, com certeza daria pra fazer essa renomeação numa passada só, fazer um loop só para trocar letra a letra de cada nome de arquivo não está me parecendo a melhor das idéias...

Por favor, pode me enviar para wagner.b...@gmail.com

2009/3/24 Psycho Mantys <psycho...@gmail.com>

Wagner Brasileiro

unread,
Mar 24, 2009, 2:52:44 PM3/24/09
to slack-u...@googlegroups.com
Se importa de me enviar para eu dar uma olhada no seu script? Consigo identificar via ER os textos estranhos, mas no momento não me vem nada na cabeça para renomear os arquivos apenas substituindo os caracteres estranhos, já que o bash não tem funções específicas para caracter como length, right, left, etc...

2009/3/24 max <mior...@gmail.com>

Wagner Brasileiro

unread,
Mar 25, 2009, 12:17:50 PM3/25/09
to slack-u...@googlegroups.com
Explica melhor o recursivo em que sentido Renato?

2009/3/24 renator <renato....@gmail.com>

jimmy

unread,
Mar 25, 2009, 1:54:06 PM3/25/09
to slack-u...@googlegroups.com
On Tue, Mar 24, 2009 at 12:59:12PM -0700, renator wrote:
>
> esses tipos de caracteres: ñß¢Ð£Øø§µÝý¥¹²³ por exemplo.
>
> Consegui adaptar um script, para alterar nomes com esses tipos de
> caracteres para hifen, mas nao consegui configurar o script para
> trabalhar recursivamente. Atualmente, o script esta desta forma:
>
> for f in *; do
> new=`echo $f | tr "àá|âãäåèéêëìíîïòóôõöùúûüçñß¢Ð£Øø§µÝý¥¹²³~?
> áÁéÉíÍóÓúÚâÂêÊôÔãÃõÕàÀòÒâð£þ®§ü" "-"`
> if [ "$f" != "$new" ]; then
> mv "$f" "$new"
> fi
> done
>
>
> Se alguem puder me ajudar a fazer o script trabalhar recursivamente ou
> tiver outra sugestão, eu agradeço.
>
> []'s,
> Renato

assumi que os caracteres em questão são os não ascii 7 (man ascii)
e que você precisa trocá-los por hífen, dessa forma você pode fazer
algo parecido com este 1liner:

find ./ -type f -regex '.*[^ -~].*' -exec sh -c 'new=`echo "{}" | tr -c "[ -~\n]" -`; echo mv -i "{}" $new' \;

mas atente para o fato de que ao renomear os caracteres para "-" você
pode acabar sobrescrevendo arquivos que passariam a ficar com nomes
iguais.


--
"Não manejo bem as palavras
Mas manipulo bem as strings."
------------------------------

Wagner Brasileiro

unread,
Mar 25, 2009, 3:42:27 PM3/25/09
to slack-u...@googlegroups.com
SIm, por isso havia perguntado da importância da nomenclatura, pois além de sobescrever pode alterar os seus nomes de maneira que sejam inutilizados pelo sistema ou por quem os criou ao não reconhecer sua nova nomenclatura.

2009/3/25 jimmy <ronal...@yahoo.com.br>

Psycho Mantys

unread,
Mar 26, 2009, 7:28:23 AM3/26/09
to slack-u...@googlegroups.com


2009/3/25 Wagner Brasileiro <wagner.b...@gmail.com>

Psycho,

Poderia enviar seu script para meu e-mail para eu analisar sua lógica, pois não me vem na cabeça como proceder para renomear os arquivos sem ter problemas, a princípio estou fazendo um "ls" que passa para um "sed" e dentro de um "for" ele vai trocando um a um cada caracter do nome do arquivo por um outro caracter qualquer a minha escolha. Funciona, mas não existe um critério bem definito qaunto a renomeção dos mesmos e segundo o Júlio César Neves com quem estudei Shell, com certeza daria pra fazer essa renomeação numa passada só, fazer um loop só para trocar letra a letra de cada nome de arquivo não está me parecendo a melhor das idéias...

Por favor, pode me enviar para wagner.b...@gmail.com

#######################################################################################################

Infelizmente, o script aqui que eu tinha se perdeu durante a "grande queima"(quando o meu HD torrou/queimou/morreu e perdi minha vida...).

Felizmente, acho que ele deve estar no meu backup. Eu já usei esse script para renomear arquivos com sucesso, e ele usa um sed num find, basicamente :D.

Precisa nem de loop se brincar. O find e xargs faz o papel do loop como sempre. Vou tentar refazer caso não ache e leh mando. Caso seja o que você precisa, vai quebrar um galho.


--

renator

unread,
Mar 26, 2009, 7:53:37 AM3/26/09
to Slackware Users Group - Brazil
Ola pessoal.

Desculpe a demora do retorno....ando meio na corrida....

Wagner, o script que estou utilizando é este abaixo:

for f in *; do
new=`echo $f | tr "àá|âãäåèéêëìíîïòóôõöùúûüçñß¢Ð£Øø§µÝý¥¹²³~?
áÁéÉíÍóÓúÚâÂêÊôÔãÃõÕàÀòÒâð£þ®§ü" "-"`
if [ "$f" != "$new" ]; then
mv "$f" "$new"
fi
done

Quando me refiro a ele não trabalhar recursivamente, quer dizer que se
eu rodar ele no /home, ele ira alterar somente os arquivos com
problemas que estao no /home, mas nao ira alterar os arquivos do /home/
renato, /home/fulano, etc....

Jimmy, os caracteres que eu considero "estranhos ou com problemas" são
esses:

âãäåèéêëìíîïòóôõöùúûüçñß¢Ð£Øø§µÝý¥¹²³~?
áÁéÉíÍóÓúÚâÂêÊôÔãÃõÕàÀòÒâð£þ®§ü

O que estou tentando fazer, é que o script altere recursivamente
(arvore de diretorios) e troque para hifen...

[]'s,
Renato

On 25 mar, 16:42, Wagner Brasileiro <wagner.brasile...@gmail.com>
wrote:
> SIm, por isso havia perguntado da importância da nomenclatura, pois além de
> sobescrever pode alterar os seus nomes de maneira que sejam inutilizados
> pelo sistema ou por quem os criou ao não reconhecer sua nova nomenclatura.
>
> 2009/3/25 jimmy <ronaldo_...@yahoo.com.br>

Wagner Brasileiro

unread,
Mar 26, 2009, 2:46:31 PM3/26/09
to slack-u...@googlegroups.com
Renato, para trabalhar recursivamente, estive olhando e a melhor opção será realmente o comando find -type f pois ele só pega arquivos e com isso evita que precisemos tratar a exclusão dos diretórios pais e outros lixos, bem como os paths, que no caso do find, já pode ser utilizado direto no comando MV ou CP como argumento. Só retificaria uma coisa, no exemplo do Jimmy, não sei se vcs sabem mas as opções EXEC e OK do FIND não suportam muitos argumentos, caso contrário ela vai dar a mensagem: "Too many arguments", para evitar isso use o comando XARGS da seguinte maneira: "comando FIND"| xargs -i rm {] {}$seq. Onde $seq pode ser: seq=`find ./ -type f -regex [sua regex]| wc -c` que vai lhe dar o número total de arquivos nesta condição, e as chaves no comando XARGS assim como no comando FIND são os índices ecnotrados por ele, seria legal utilizar um TR em cima da segundo par de chaves para retirar os caracteres estranhos, mas não sei se o TR os trocará de uma unica vez, caso cntrário teria que colocar essa linha dentro de um loop e ir mudando cada arquivo destes caracter por caracter até que nenhum atend aamis a condição da ER.

Espero não ter complicado muito, qq dúvida é só perguntar.




2009/3/25 jimmy <ronal...@yahoo.com.br>

renator

unread,
Mar 26, 2009, 8:44:41 PM3/26/09
to Slackware Users Group - Brazil
hummm....muito obrigado pelas dicas pessoal....principalmente a sua
explicação Wagner....de qualquer forma, ela foi util para mim aprender
um pouco mais sobre find e entender melhor a utilização do
xargs :).....se eu obtiver o sucesso que eu quero no script, eu posto
aqui....abraços...

Renato

On 26 mar, 15:46, Wagner Brasileiro <wagner.brasile...@gmail.com>
wrote:
> Renato, para trabalhar recursivamente, estive olhando e a melhor opção será
> realmente o comando find -type f pois ele só pega arquivos e com isso evita
> que precisemos tratar a exclusão dos diretórios pais e outros lixos, bem
> como os paths, que no caso do find, já pode ser utilizado direto no comando
> MV ou CP como argumento. Só retificaria uma coisa, no exemplo do Jimmy, não
> sei se vcs sabem mas as opções EXEC e OK do FIND não suportam muitos
> argumentos, caso contrário ela vai dar a mensagem: "Too many arguments",
> para evitar isso use o comando XARGS da seguinte maneira: "comando FIND"|
> xargs -i rm {] {}$seq. Onde $seq pode ser: seq=`find ./ -type f -regex [sua
> regex]| wc -c` que vai lhe dar o número total de arquivos nesta condição, e
> as chaves no comando XARGS assim como no comando FIND são os índices
> ecnotrados por ele, seria legal utilizar um TR em cima da segundo par de
> chaves para retirar os caracteres estranhos, mas não sei se o TR os trocará
> de uma unica vez, caso cntrário teria que colocar essa linha dentro de um
> loop e ir mudando cada arquivo destes caracter por caracter até que nenhum
> atend aamis a condição da ER.
>
> Espero não ter complicado muito, qq dúvida é só perguntar.
>
> 2009/3/25 jimmy <ronaldo_...@yahoo.com.br>
Reply all
Reply to author
Forward
0 new messages