http://www.zago.eti.br/script/converter-arquivos.txt Neste documento, modelos de script pra converter arquivos, converter nomes, conteúdo, formato, renomear e etc.... Veja também o FAQ: http://www.zago.eti.br/convert.txt Use CTRL+F para refinar a pesquisa. Linha de: **************** separa mensagens ou tópicos. ******************************************************** Zago http://www.zago.eti.br/menu.html FAQ e artigos sobre Linux Pra rodar qualquer modelo de script abaixo, tenha o cuidado de saber o que está fazendo, procure fazer em HD de testes, quando isto não for possivel procure fazer em um diretório de testes, procure entender o que está fazendo, alguns scripts são destrutivos, portanto, backup nunca é de mais....... Pra Converter arquivos do linux pra windows ou vice versa, veja sobre dos2unix e unix2dos no FAQ: http://www.zago.eti.br/convert.txt Pra arrumar nome de arquivos, tirar caracteres especiais e converter nomes pra minusculo, procure neste documento pro funções zz. http://www.vivaolinux.com.br/artigos/verArtigo.php?codigo=1398 Codificação de caracteres de arquivos ASCII dicas pra converter arquivos com caracteres especiais, acentos e codificação de idioma. ******************************************************** RENOMEAR ARQUIVOS: Este script renomeia pra minusculo o nome de todos os arquivos do diretório corrente. #!/bin/bash for file in `ls` do mv $file `echo $file | dd conv=lcase` echo $file done Este script renomeia pra MAIUSCULO o nome de todos os arquivos do diretório corrente. [root@ufla oldirceu]# cat TESTE #!/bin/bash for file in `ls` do mv $file `echo $file | dd conv=ucase` done OBS. Os exemplos acima não convertem arquivos espaços no nome. Precisa remover os espaços ou substituir por _, prefiro fazer a troca do espeço por underline ou hifen _ - , esta linha de comando faz a troca do espaço por underline _ : [root@ufla tmp]# for i in `ls | sed 's/ /_/g'`; do ARQ=`echo $i | sed 's:_: :g'`; mv "$ARQ" $i; done depois de retirar os espaços a linha de comando abaixo converte tudo pra minusculo. [root@ufla tmp]# for i in *; do mv -i $i $(echo $i | tr "[upper]" "[lower]"); done Pra trocar algum simbolo, por exemplo () utilizado nos nomes, quando for poucos arquivos vale a pena fazer manual mesmo, acesse pelo ambiente gráfico (konqueror) e faça a alteração, pra fazer na linha de comando precisa usar a barra invertida \ antes de cada espaço e simbolo, use a tecla tab pra completar o nome ou o mouse pra copiar e colar, por exemplo pra renomear o arquivo BANESPA (1).dbx pra banespa_1.dbx execute o comando: mv BANESPA\ \(1\).dbx banespa_1.dbx Deve ter algum script pronto pra isto, não localizei nem consegui fazer no momento que escrevia este tuto, qualquer contribuição será bem vinda, preciso de algo que faça isto atraves de script, voce tem a solução? Zago ******************************************************** ARRUMANDO NOME DE ARQUIVOS. funcoeszz zzarrumanome Configurações de idiomas, arquivos copiados de um sistema pra outro e outras tantas situações acabam aparecendo arquivos nomeados de diferentes maneiras que complica automatizar tarefas com o uso de scripts. Arquivos a serem utilizados em scripts não deve ter espaços no nome nem caracteres acentuados ou simbolos, o melhor é remover tudo, limpar o nome, claro que isto também pode trazer outros problemas, além dos usuários reclamarem do novo nome tem situações que pode resultar em erro ou perda de arquivos, voce pode renomear os arquivos na mão, konqueror ou linha de comando um a um a seu modo. Ou simplesmente com uma linha de comando, no site do Aurelio tem um script prontinho pra fazer isto, é a função zzarrumanome. Acesse a página do Aurelio: http://www.aurelio.net, faça download das funcões zz, siga as intruções da página, fazer o download do arquivo com todos os scripts, não copie e cole somente uma função porque não funciona, tem que salvar o arquivo em um diretório do path, torna-lo executável e depois vá pro diretório onde estão os arquivos pra arrumar o nome e digite: funcoeszz zzarrumanome * Prontinho, todos os arquivos no diretório onde executou o comando estão com nomes em minusculo, sem acentos, trocou espaços por _ e retirou os caracteres especiais, lembre de agradecer ao Aurelio..... Prefira sempre fazer em um diretório a parte ou até mesmo em outra maquina, em micros de produção faça somente depois de testado e saber o que está fazendo. RESUMO ZAGO ( faz tudo, como root, basta colar as linhas abaixo no prompt pra baixar as funções e arrumar nomes dos arquivos em /tmp) cd /usr/bin wget http://aurelio.net/zz/funcoeszz chmod +x funcoeszz cd /tmp funcoeszz zzarrumanome * ******************************************************** em 27/01/2006 recebi este relato de; (Tulio M. Barros - UIN(ICQ):1593641 tmbarros[a]myrealbox.com LUN:174012 Tentei usar o funcoesZZ num determinado subdiretório e ele renomeou todos os 55 arquivos para .1, .2, .3, .4, ... .54, .55, foi coisa de louco. Talvez seja bom falar com o Aurélio sobre esse bug.) Achei estranho, sempre uso no CL10 e nunca detectei isto, então resolvi testar no SUSE 10 usar as funções zz sem instalar, criei o diretório testezz dentro de meu home para arrumar o nome dos arquivos em /tmp/testenome; ls /tmp/testenome/ nome com espa?os.txt refei??o.doc referencial te?rico.doc rela??o.doc mkdir testezz cd testezz wget http://aurelio.net/zz/funcoeszz chmod +x funcoeszz funcoeszz zzarrumanome /tmp/testenome/* Resultado errado, os arquivos ficam ocultos (iniciam com ponto) e realmente nomeia os arquivos com numeros .1, .2, ...... Resolvi fazer o mesmo teste no CL10, instalado com os CD normais, sem o CD upd1 e sem qualquer atualização, funcionou, veja o resultado; [zago@faqcl10 testenome]$ ls refeição.doc referencial teórico.doc rela?Æo.doc [zago@faqcl10 testenome]$ wget http://aurelio.net/zz/funcoeszz --00:08:07-- http://aurelio.net/zz/funcoeszz => `funcoeszz' Resolving aurelio.net... 66.35.250.210 Connecting to aurelio.net[66.35.250.210]:80... connected. Requisição enviada ao servidor HTTP, esperando resposta... 200 OK Tamanho: 90,889 [text/plain] 100%[=================================>] 90,889 28.69K/s ETA 00:00 00:08:11 (28.61 KB/s) - `funcoeszz' recebido [90889/90889] [zago@faqcl10 testenome]$ chmod +x funcoeszz [zago@faqcl10 testenome]$ ./funcoeszz zzarrumanome * `refeição.doc' -> `./refeicao.doc' `referencial teórico.doc' -> `./referencial_teorico.doc' `rela\207Æo.doc' -> `./rela_o.doc' [zago@faqcl10 testenome]$ ls funcoeszz refeicao.doc referencial_teorico.doc rela_o.doc Solução? Não tenho, sei que funciona no CL10, em outras distros pode dar problema, portanto aplique antes em diretório de testes para ver o resultado ou aplique esta dica do Tulio, veja mensagem abaixo. De: Tulio Miranda Barros Para: Linux-Br Assunto: Re: (linux-br)Renomear arquivos com unicode inválido [solução] Data: Sat, 04 Feb 2006 02:48:03 -0300 Olá gente, Confesso que não foi das mais elegantes e inteligentes soluções, mas como meu problema não era tão monstruoso assim (perto de 3 mil arquivos em apenas 6 diretórios) repeti o procedimento 6 vezes. Basicamente, o que fiz foi: ls > arquivos e sai editando o "arquivos" de tal forma que terminasse com algo como: mv article\?\=aborto\ \&\ homicídio article__aborto\ e\ homicidio depois rodei o "script". O processo de edição é relavitamente rápido feito numa planilha do openoffice - duplicar uma coluna e fazer alterações. Prontas as colunas, colei no gedit e substitui \n por \nmv e \t por " " (espaço). Inclui #!/bin/bash e executei. Obrigado a todos que ajudaram []'s -- *********************************** Tulio M. Barros - UIN(ICQ):1593641 tmbarros[a]myrealbox.com LUN:174012 *********************************** ******************************************************** REMOVENDO LINHAS DE ARQUIVOS. com cat e grep, neste exemplo pra remver do arquivo access.log as linhas que contenha a palavra secureweb, basta executar: cat access.log |grep -v "secureweb" > accesslimpo preserva o arquivo original e salva as alterações em accesslimpo ou seja accesslimpo não tem linhas com a palavra secureweb. Limpar os arquivos de configuração, tirar os comentarios. Não adoto isto, mas tem que pede pra fazer, prefira fazer uma copia antes, por exemplo pro arquivo /etc/sarg.conf: cd /etc/sarg cp sarg.conf sarg.conf.original pra limpar o arquivo e fazer a copia de volta: cat sarg.conf.original |grep -v "#" > sarg.conf ou indique o caminho do arquivo, ex.: cat /etc/sarg/sarg.conf.original |grep -v "#" > /etc/sarg/sarg.conf Lembre de manter uma copia do original, faça antes de substituir ou renome-los. Ou com egrep, neste exemplo salva a saida no arquivo sarg.conf sem as linhas iniciadas com # e remove também a linhas em branco cp sarg.conf sarg.conf.original egrep -v "^#|^$" sarg.conf.original > sarg.conf Remover o primeiro caracter de cada linha do documento, independe de qual seja o caracter, cortar somente o prirmerio caracter: por exemplo do arquivo dd.txt e salva em dd2.txt cat dd.txt | cut -c 2- > dd1.txt Pra remover os primeiros 2 caracteres de cada linha. cat dd.txt | cut -c 3- > dd2.txt Note que a diferença está no parametro que muda de 2 pra 3, pra remover mais caracteres, altere este parametro e faça testes. Remover todas as linhas que inicia com sinal de maior ">" por exemplo do arquivo dd.txt do FAQ, salvar a saida em ddmenos.txt egrep -v "^>" dd.txt > ddmenos.txt Pra eliminar também as linhas em branco: egrep -v "^>|^$" dd.txt > ddmenos.txt ed Removendo linhas de um arquivo com "ed", ele modifica o arquivo, veja outras opções neste documento que preserva o original, ou faça copia do arquivo antes de iniciar o uso do "ed", neste exemplo um arquivo de log do squid, access.log, contando a linhas do arquivo: [zago@faqcl9 tmp]$ wc -l access.log 64626 access.log ed - arquivo.txt >/dev/null < (prompt) continue digitando.... uma linha por vez assim: ed - access.log >/dev/null </dev/null < g.gator.d > . > w > q > ! [zago@faqcl9 tmp]$ wc -l access.log 63976 access.log [zago@faqcl9 tmp]# wc -l access.log 63976 access.log ******************************************************** Caracteres especiais precisa acrescentar uma \ antes do simbolo, por exemplo, pra trocar todos os .(ponto) por _(underline) a expressão em sed: sed "s/\./_/g" arquivooriginal > arquivotroca Ou com tr: tr . _ < arquivo ******************************************************** Este script acrescenta terminação no nome do arquivo, por exemplo, pra acrescentar .old em todos os arquivos .txt do diretório corrrente: [root@ufla teste2]# cat teste2 #!/bin/bash for arq in *.txt ; do novo=`basename "$arq".old` mv "$arq" "$novo" done ******************************************************** SED - trocar, substituir palavra ou strings(palavras) dentro de um arquivo. sed = Stream Editor. sed é uma ferramenta poderosa pra manipular arquivos, muito útil e pratica pra utilizar em scripts ou linha de comando sem precisar de usar um editor de texto abrir o arquivo, alterar e salvar. Com o sed dá pra fazer alterar arquivos como se faz com o "vim", com a diferença que no vim você precisa acessar o arquivo para alterar enquando que o sed se faz isto em linha de comando... sed "s/stringoriginal/stringtroca/g" arquivooriginal > arquivotroca onde: stringoriginal = a palavra ou string que procura pra troca. stringtroca = a palavra ou string que existirá no novo arquivo arquivooriginal = arquivo existente que será preservado intacto. arquivotroca = novo arquivo com as alterações. Por exemplo: [root@ufla tmp]# vi arquivo.txt [root@ufla tmp]# cat arquivo.txt Neste arquivo tem zago, com o comando sed todas as ocorrencias da palavra zago serão modificadas pra Antonio Francisco Zago, compare os dois arquivos. [root@ufla tmp]# sed "s/zago/Antonio Francisco Zago/g" arquivo.txt > arquivomodificado.txt [root@ufla tmp]# cat arquivomodificado.txt Neste arquivo tem Antonio Francisco Zago, com o comando sed todas as ocorrencias da palavra Antonio Francisco Zago serão modificadas pra Antonio Francisco Zago, compare os dois arquivos. No exemplo acima o sed modificou o conteúdo do arquivo, onde encontrou a palavra "zago" fez a substituição por "Antonio Francisco Zago" sem precisar usar um editor de texto pra abrir o arquivo fazer a troca e salvar, em uma única linha de comando o sed executou esta tarefa em todo o arquivo. Exemplo pra remover palavras ou strings de um documento. [root@ufla tmp]# sed "s/zago//g" arquivo.txt > arquivomodificado.txt [root@ufla tmp]# cat arquivomodificado.txt Neste arquivo tem o nome , com o comando sed todas as ocorrencias da palavra serão modificadas pra Antonio Francisco Zago, compare os dois arquivos. No exemplo acima não foi indicado string, ela está vazia, portanto a palavra "zago" foi removida (substituida por um campo vazio), veja que também é case sensitive, Zago com Z maiusculo não foi substituido. veja mais sobre o uso do sed em: http://www.zago.eti.br/sed.txt Com "vi" também faz esta substituição, pode se fazer no próprio arquivo vim '+%s/string1/string2/g' '+wq' arquivo.txt veja como fica o arquivo.txt após a linha de comando abaixo. vim '+%s/zago/Antonio Francisco Zago/g' '+wq' arquivo.txt [root@ufla tmp]# cat arquivo.txt Neste arquivo tem Antonio Francisco Zago, com o comando sed todas as ocorrencias da palavra Antonio Francisco Zago serão modificadas pra Antonio Francisco Zago, compare os dois arquivos. obs. foi utilizado o mesmo texto pro sed, antes das alterações, no texto acima aparece a referencia ao sed mas ele não foi utilizado nesta conversão. ******************************************************** REMOVER LINHAS DE UM ARQUIVO. :1,$ s /procure/troque/g :1,$ s /procure/troque/g ******************************************************** Diferenças entre dois arquivos. diff arq1 arq2 Ou com separação por colunas. diff -y --suppress-common-lines squidz.conf squidt.conf | tr -d '\011' | tr -d ' ' Ou diff -y --suppress-common-lines squidz.conf squidt.conf | tr -d '\011' ******************************************************** De:  joaquim abc Para:  linux-br@bazar2.conectiva.com.br Assunto:  Re: (linux-br)Maiuscula para Minuscula Data:  Fri, 9 Jul 2004 16:36:22 -0300 Em Qui 08 Jul 2004 19:48, Reinaldo de A. Bonilho escreveu: > Boa Noite PessALL, > > Alguem tem um scritp que transforme arquivos e > diretórios Maiusculos para Minusculos ??? > Eu faria assim: find (diretorio) | while read JA do    test "$JA" = '.' && continue    ja=`echo $JA | tr "[:upper:]" "[:lower:]"`    mv "$JA" "$ja" done Acho que em condiçoes normais de temperatura e pressao, funcionaria. Faça o seu !!!! joaquim abc ******************************************************** De:  claudio@conectiva.com Para:  Brunhara Cc:  Linux-Br Assunto:  Re: (linux-br) Trocar ponto por traço CL10 Data:  Thu, 5 Aug 2004 13:58:31 -0300 (BRT) On Wed, 4 Aug 2004, Brunhara wrote: > exemplo, eduardo.autotec  gostaria de  trocar por  _  ficando > eduardo_autotec eu gerei uma lista dos usuarios e apartir desta > lista eu quero gerar uma com as alterçoes. tr . _ < lista ******************************************************** De:  Marcos R. Pawloski Para:  claudio@conectiva.com, joaquim abc Cc:  linux-br@bazar2.conectiva.com.br Assunto:  Re: (linux-br)Maiuscula para Minuscula Data:  Sun, 18 Jul 2004 12:18:27 -0300 Mais um pitaco de sugestão: ----------------------  cut  -------------------------------------- #!/bin/sh # Tabajara's power mudêitor plus if [ $# = 0 ] then echo "Muda o nome de um arquivo e diretorio para minuscula. Uso: ./muda [nome...]" exit fi for NOME in $* do NNOME=`echo $NOME | tr '[A-Z]' '[a-z]'` if ! [ -f $NNOME ]; then mv $NOME $NNOME fi done ----------------------  cut  -------------------------------------- Se executar um  ./muda.sh *  muda tudo que estiver no diretório corrente... (8-M > > Alguem tem um scritp que transforme arquivos e > > diretórios Maiusculos para Minusculos ??? > Eu faria assim: > > find (diretorio) | while read JA > do >    test "$JA" = '.' && continue >    ja=`echo $JA | tr "[:upper:]" "[:lower:]"` >    mv "$JA" "$ja" > done > > Acho que em condiçoes normais de temperatura e pressao, funcionaria. Eu faria assim: rename 'y/A-Z/a-z/' * ******************************************************** De: Djames Suhanko Para: linux-br@bazar2.conectiva.com.br Assunto: Re: (linux-br)Script p/ renomear arquivos em lowcase Data: Thu, 10 Nov 2005 14:58:38 -0200 Poutes ! Esqueci de fechar: ls|while read line; do mv "$line" $(echo $line |tr [[:upper:]] [[:lower:]]); done sorry ! Em Qua 09 Nov 2005 21:52, Djames Suhanko escreveu: > unalias ls > ls|while read line; do mv "$line" $(echo $line |tr [[:upper:]] [[:lower:]]; > done -- -- Djames Suhanko - LinuxUser 158.760 ******************************************************** De: Djames Suhanko Para: linux-br@bazar2.conectiva.com.br Assunto: Re: (linux-br)Renomear arquivos com unicode inválido Data: Tue, 24 Jan 2006 22:25:01 -0200 Olá ! Para remover aberrações de arquivos de download, criei o seguinte script: remover_espaco.sh linha 1- #!/bin/sh linha 2- CONTA=`echo $1|egrep "/|."|wc -c` linha 3- if [ $CONTA -lt 1 ]; then linha 4- echo "Use: $0 caminho/dos/arquivos/" linha 5- exit 0 linha 6- fi linha 7- echo "Voce escolheu remover espacos do seguinte diretorio: \"$1\"" linha 8- echo "Isto esta correto [s/n]?" linha 9- read i linha 10- case $i in linha 11- s) ls $1|while read linha; do mv "$1/$linha" $(echo $1/$linha|tr " (){}[]+" >>>"_"|sed -e 's/_-_/-/g'|sed -e 's/__/_/g'|sed -e 's/\&/_e_/g');done 2>/dev/null ;; linha 12- *) exit 0;; linha 13- esac Na linha 11 você não quebra, ou seja - após o tr há um espaço e continua em " (aspas) Espero que ajude! Abraços ! Em Terça 24 Janeiro 2006 12:32, Tulio Miranda Barros escreveu: > Olá todos, > > Tenho algumas centenas de arquivos (doc, pdfs e zip) de usuários com > acentos, cedilhas, graus e todo tipo de símbolo (incusive os arquivos > dentro dos zips) que estão agora guardados num diretório de documentos > públicos para ser compartilhado com toda a rede.... -- Djames Suhanko - LinuxUser 158.760 ******************************************************** De: Manoel Pinho Para: Tulio Miranda Barros Cc: Linux-Br Assunto: Re: (linux-br)Renomear arquivos com unicode inválido Data: Tue, 24 Jan 2006 15:21:26 -0200 Tulio Miranda Barros escreveu: > Tenho algumas centenas de arquivos (doc, pdfs e zip) de usuários com > acentos, cedilhas, graus e todo tipo de símbolo (incusive os arquivos > dentro dos zips) que estão agora guardados num diretório de documentos > públicos para ser compartilhado com toda a rede. > > Dependendo do lugar que ele é lido, um mesmo arquivo pode ser visto de > várias formas: > TEORIA DA INELEGIBILIDADE INOVA??ES.ppt (invalid encoding) > TEORIA DA INELEGIBILIDADE INOVA??ES.ppt > TEORIA DA INELEGIBILIDADE INOVA ES.ppt > TEORIA\ DA\ INELEGIBILIDADE\ INOVA\uffff\uffffES.ppt > > E alguns não conseguem acessar e dentro dos zips nao se consegue nem ler > o nome do arquivo. > > Teria uma forma de renomear todos esses arquivos com um script? Altere a linha do arquivo /etc/fstab correspondente à partição onde está esse diretório para usar a opção "iocharset=utf8", como nos exemplos abaixo /dev/hda1 /win vfat umask=0,iocharset=utf8 0 0 /dev/hdc /mnt/cdrom iso9660 user,iocharset=utf8,noauto,ro,exec 0 0 (logicamente altere para o seu caso) Depois monte novamente essa partição. ******************************************************** ********************************************************