Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

renomear pastas com caracteres invalidos.

1,212 views
Skip to first unread message

hamacker

unread,
Sep 10, 2008, 9:30:09 PM9/10/08
to
Tenho em meu sistema várias pastas com nomes assim
'capela-a�o-inox-316', no local do 'ç', simplesmente um '?' e não
consigo renomea-la via terminal com o find.
Isso ocorreu na época em que migramos do NT->Samba e depois do ISO
Latin1 para UTF8. Então só os arquivos muito antigos sofrem desse
problema.

Eu queria achar um jeito de renomear todas essas pastas via script,
mas tá dificil, o script sempre esbarra nesses caracteres invalidos.

Eu estou fazendo mais ou menos assim :

for f in `find /local/para/renomear -type d 2>/dev/null` ; do
CUR_FOLDER=`dirname $f`
CUR_BASENAME=`basename "$f"`
# renomeando para minusculo e removendo espacos/caracteres especiais
g=`expr "xxx$g" : 'xxx\(.*\)'|tr '[A-Z]' '[a-z]'|tr ' ' '_'`
g="${g//[:;*?\"<>|]/_}"

if [ "$CUR_BASENAME" != "$g" ] ; then
echo "rename : $f -> $CUR_FOLDER/$g"
# mv "$f" "$CUR_FOLDER/$g"
fi
done

O script tá emperrando nas pastas com caracteres inválidos onde ele
trunca o nome do arquivo na nésima casa onde está o suposto caracter
invalido.
A saída seria o find exibir os caractes de escape do tipo \0345 para
representar a acentuação envolvida, mas parece que o find não tem
parametro para isso.

Alguem conhece alguma solução para este problema ou algum programa que
se propõe a isso ?

Sávio Ramos

unread,
Sep 11, 2008, 5:40:05 AM9/11/08
to
Em Wed, 10 Sep 2008 22:21:32 -0300
hamacker <sirha...@gmail.com> escreveu:

> Eu queria achar um jeito de renomear todas essas pastas via script,
> mas tá dificil, o script sempre esbarra nesses caracteres invalidos.

Você poderia fazer um script incluindo o programa convmv ele converte
nomes de diretórios e pastas de uma codificação para outra.

--
Sávio M Ramos
Arquiteto, Rio, RJ
Só uso Linux desde 2000
www.debian.org


--
To UNSUBSCRIBE, email to debian-user-por...@lists.debian.org
with a subject of "unsubscribe". Trouble? Contact listm...@lists.debian.org

hamacker

unread,
Sep 11, 2008, 8:20:09 AM9/11/08
to
O problema é que eu não quero mesmo a acentuação.
Se houvesse como, eu até gostaria que o próprio samba convertesse
esses caracteres.

As acentuações me atrapalham de diversas formas, por exemplo, quando
faço backup dos arquivos de unix para unix eles veem que é uma
maravilha, mas se eu fizer o backup no unix e for restaurar no windows
então coisas estranhas as vezes acontecem de voce não conseguir
excluir a pasta por causa do caracter invalido que ele (windows) foi
capaz de reproduzir, mas foi incapaz de gerencia-la. Sem falar nos
backups em DVDs que ficam problemáticos se voce não empacotar tudo num
zip/7z. Outra coisa, meu backup é .tar.gz e crio um indice .txt onde o
usuário varre o .txt com o find do windows e nos passa a localização
da mídia para que possamos restaurar somente este arquivo, mas o
usuário é #$%& e gera os arquivos com acentuações, mas não usa os
mesmos acentos na hora da busca, e se usa, mas tem dois espaços ou
teve um caracter que virou '?' esse arquivo indubitavelmente estará
perdido embora exista.

É por essas e outras razões que gostaria de remover as acentuações de
nomes de arquivos do sistema de arquivos.

2008/9/11 Sávio Ramos <savio...@gmail.com>:

Sávio Ramos

unread,
Sep 14, 2008, 8:40:06 AM9/14/08
to
Em Thu, 11 Sep 2008 09:15:56 -0300
hamacker <sirha...@gmail.com> escreveu:

> É por essas e outras razões que gostaria de remover as acentuações de
> nomes de arquivos do sistema de arquivos.

funçoes zz?

china

unread,
Sep 15, 2008, 8:40:07 AM9/15/08
to


2008/9/10 hamacker <sirha...@gmail.com>

Eu estou fazendo mais ou menos assim :

for f in `find /local/para/renomear -type d  2>/dev/null` ; do
 CUR_FOLDER=`dirname $f`
 CUR_BASENAME=`basename "$f"`
 # renomeando para minusculo e removendo espacos/caracteres especiais
 g=`expr "xxx$g" : 'xxx\(.*\)'|tr '[A-Z]' '[a-z]'|tr ' ' '_'`
 g="${g//[:;*?\"<>|]/_}"

 if [ "$CUR_BASENAME" != "$g" ] ; then
   echo "rename : $f -> $CUR_FOLDER/$g"
   # mv "$f" "$CUR_FOLDER/$g"
 fi
done

Falta incluír o nome da pasta/arquivo com caracter inválido entre aspas duplas.

Davi Vidal

unread,
Sep 15, 2008, 9:00:15 AM9/15/08
to


Peguei o bonde andado, mas as funções ZZ não resolvem isso?

http://funcoeszz.net


HTH,
--
Davi Vidal
--
E-mail: davi...@siscompar.com.br
MSN : davi...@msn.com
GTalk : davi...@gmail.com
Skype : davi vidal
YIM : davi_vidal
ICQ : 138815296

hamacker

unread,
Sep 15, 2008, 9:20:12 AM9/15/08
to
Nao conheço as funcoes zzz.

O script tá terminado, mas descobrí que tenhos dois problemas distintos.

Problema 1) Renomear retirando acentuação dos arquivos, ok, já resolví
isso, o script tá pronto.
Problema 2) Antes de renomear os arquivos é preciso localizar arquivos
cujos nomes está "encodado" iso8859-1 (latin1) e usar o aplicativo
'recode' "ISO-8859-1..UTF-8". Será que existe algum 'find' capaz de
localizar estes tipos de arquivos ?

Nossa arvore de arquivos é enorme, especialmente a área de projetos
cuja profundidade de niveis de diretórios e coisa de outro mundo (será
que toda area de engenharia/arquitetura é assim?)

2008/9/15 Davi Vidal <davi...@siscompar.com.br>:

china

unread,
Sep 15, 2008, 1:10:11 PM9/15/08
to


2008/9/15 hamacker <sirha...@gmail.com>

Nao conheço as funcoes zzz.

Experimenta, use zzarrumanome recursivamente e seja feliz (faça backup antes, heheheh)!

O script tá terminado, mas descobrí que tenhos dois problemas distintos.

Problema 1) Renomear retirando acentuação dos arquivos, ok, já resolví
isso, o script tá pronto.
Problema 2) Antes de renomear os arquivos é preciso localizar arquivos
cujos nomes está "encodado" iso8859-1 (latin1) e usar o aplicativo
'recode' "ISO-8859-1..UTF-8". Será que existe algum 'find' capaz de
localizar estes tipos de arquivos ?

Use o find para localizar por data ou outro parâmento

find <caminho> -mtime -1000 -type f -print

Isso retornará os arquivos modificados nos ultimos mil dias independente do nome !!!!!

Tá certo, isso é um POG, por isso você pode e deve experimentar as funçõesZZ
 

Nossa arvore de arquivos é enorme, especialmente a área de projetos
cuja profundidade de niveis de diretórios e coisa de outro mundo (será
que toda area de engenharia/arquitetura é assim?)

É, é assim sim, e dependendo da higiene do profissional não dá nem para chegar perto!!!

hamacker

unread,
Sep 15, 2008, 2:30:19 PM9/15/08
to
Pois é, Anderson.
Mas temos um problema.
Eu tenho (ou pode haver) na mesma arvore de diretorios arquivos
"encodados" em UTF e outros em ISO.
Fiz o teste aqui e se eu aplicar a conversao indiscriminadamente vai
dar zebra, nao posso aplicar a conversao ISO->UTF em cima de arquivos
que já sejam utf, fiz o teste usando o recode e deu zebra a ponto de
alguns arquivos sumirem e outros virarem ______________ (underlines
para cada caracter), por isso eu preciso dum comando que identifique o
encode de cada arquivo e se for diferente de utf-8 daí entao aplicar o
recode. Nao fiz o teste ainda com o 'convmv', mas me diz, quando voce
aplicou era tudo ISO ou voce tinha UTF no meio ? O '-r' é recursivo ?

O unico comando que descobri via google que pode descobrir a
codificacao de um arquivo é o 'auto_ef', mas ele é para solaris. Mas
se houvesse outro similar eu poderia identificar os arquivos problemas
e fazer o convmv só neles.

[]'s


2008/9/15 Anderson Kaiser <alpk...@gmail.com>:
>
> Olha, do find acredito que não tenha nenhum que possa te ajdar, mas você
> pode utilizar um comando chamado convmv. Ele muda a codificação dos arquivos
> e diretórios:
>
> Um exemplo de utilização do comando:
> # convmv -r -f iso8859-1 -t utf8 /diretorio/* --notest
>
> Ele já foi de grande ajuda para meu sistema de Arquivos Samba aqui, e
> acredito que vá te ajudar bastante. a Opção --notest é para que ele já faça
> diretamente a conversão, e não demore uma eternidade no processo. Mas dê uma
> lida no manual dele que acho que ele poderá te ajudar.

Tiago Saboga

unread,
Sep 15, 2008, 8:50:08 PM9/15/08
to
On Mon, Sep 15, 2008 at 03:25:49PM -0300, hamacker wrote:
> O unico comando que descobri via google que pode descobrir a
> codificacao de um arquivo é o 'auto_ef', mas ele é para solaris. Mas
> se houvesse outro similar eu poderia identificar os arquivos problemas
> e fazer o convmv só neles.

Até onde eu saiba, não é possível determinar com certeza qual a
codificação de um arquivo, e muito menos de um nome de arquivo. O
problema é que quase todos os valores são válidos dentro de quase
todas as codificações. Por exemplo, se pego o nome de arquivo "ação",
já em utf8, e o converto como se estivesse em iso8859-1, terei
"ação". Para o computador, os dois nomes são igualmente válidos. Se
todos os arquivos usarem palavras em português, você poderia tentar
usar um dicionário, mas em geral não é o caso.

Se em cada diretório todos os arquivos tiverem a mesma codificação,
você pode usar um comando como "ls | file", pois o file tem um
algoritmo para tentar encontrar a codificação, baseando-se em certos
caracteres que são inválidos em certas codificações. Se os arquivos
estiverem realmente misturados fica muito difícil, pois a quantidade
de letras em cada arquivo é muito pequena para ter certeza da
codificação.

Tiago.

0 new messages