shell-script-pt
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [shell-script] Descompactar arquivos pelo Nautilus


From: Fernando Mercês
Subject: Re: [shell-script] Descompactar arquivos pelo Nautilus
Date: Wed, 18 Jan 2012 17:41:49 -0200

Entendi, Alysson. Foi o que imaginei, mas o final do texto enrolou um pouco. ;-)

Dá uma olhada:

grep -E '\.(zip|rar|7z)$' | grep -Ev 'part[0-9]{0,3}\.rar$'

O primeiro faz o grep pelas extensões, normal.

O segundo grep casa com partXXX, partXX, partX ou até mesmo part, onde
X é um dígito qualquer. Os arquivos *.7z.XXX já são filtrados pelo
primeiro grep, então não é necessário tratar no segundo.

Agora, sobre sua pergunta em não usar o segundo grep (com -v para
inverter a lógica), não vejo como, a não ser que houvesse um número
fixo de dígitos para o caso do partXXX.rar. Neste caso, daria pra você
usar o lookbehind das regex do Perl:

grep -P '(zip|7z|(?<!part[0-9]{3})\.rar)$'

Mas como falei antes, este tipo de expressão só funciona com
expressões de tamanho fixo. Não dá pra usar {0,3}, que é o que você
precisa pois os arquivos podem ser part1, part01 ou part001 (ou até
mesmo part, creio). Então, já era...

Se quiser saber mais sobre esse operador "moderniho", como diz o Verde
hehe dá uma olhada:
http://aurelio.net/regex/guia/modernosos-nao-atras.html#3_5_6

Um abraço.

Att,

Fernando Mercês
Linux Registered User #432779
www.mentebinaria.com.br
softwarelivre-rj.org
@MenteBinaria
------------------------------------
II Hack'n Rio - 23 e 24/11
                 hacknrio.org
------------------------------------



2012/1/18 Alysson Gonçalves de Azevedo <address@hidden>:
> é que é assim, Fernando, tanto o 7zip quanto o rar permite você dividir os
> arquivos em partes pequenas de tamanhos desejados... isso para poder
> armazenar arquivos grandes em disquetes ou etc.
>
> essa divisão é feita de seguinte forma.
> o 7zip cria vários arquivos no seguinte formato Arquivo.7z.N, onde N vai de
> 001 até a quantidade total de arquivos.
> já o rar divide em Arquivo.part1.rar até Arquivo.partN.rar
> e para descompactar, vc clica no primeiro arquivo e manda extrair,
> normalmente. Se você clicar para extrair diretamente o segundo, ele vai
> ignorar o primeiro e, no final, vai dar erro.
>
> agora, indo ao ponto, naquele trecho do código, eu faço um ls para
> filtrando apenas os arquivos compactados.
> o problema é que se eu filtrar apenas por ".rar", vai retornar o
> "Arquivo.part1.rar" e todos os outros "Arquivo.partN.rar", e com isso, eu
> vou rodar o comando de extrair trocentas vezes (o que já está errado, por
> que tem que executar apenas 1 vez), e sendo que só a primeira vai funcionar
> e todas as demais vão dar erro.
>
> e para variar, o sistema de divisão do rar não é padronizado, igual ao 7z,
> o "Arquivo.partN.rar" pode começar com 1, 01, 001, etc.
> por isso eu tenho que fazer todo aquele malabarismo.
>
> E de certa forma, está funcionando. A questão mesmo que perguntei era se
> alguém conhece outro comando para fazer o "grep" e o "grep -v" juntos, pq
> eu não consegui achar nada...
>
> No mais, muito obrigado e você e todo mundo que tá sempre ajudando.
>
> Alysson Gonçalves de Azevedo
> (11) 8491-7730
>
>
>
> Em 18 de janeiro de 2012 09:13, Fernando Mercês <address@hidden>escreveu:
>
>> **
>>
>>
>> Sempre tem como encurtar. hehe
>>
>> No entanto, confesso que não entendi bem a última parte. Você diz que quer
>> retornar por exemplo "arquivo2.part1.rar", mas quer ignorar
>> "arquivo2.part2.rar". É isso mesmo? Poderia explicar melhor?
>>
>> Eu tinha entendido que você não queria arquivos com "part". Neste caso:
>>
>> grep -E '\.(zip|rar|7z(\.001)?)$' | grep -Ev 'part[0-9]{0,3}\.rar'
>>
>> Agora, se só não quiser os arquivos que terminam com .part, só o primeiro
>> grep já resolve.
>>
>> Qualquer outra possibilidade eu não entendi. rs
>>
>> Um abraço.
>>
>> Att,
>>
>> Fernando Mercês
>> Linux Registered User #432779
>> www.mentebinaria.com.br
>> softwarelivre-rj.org
>> @MenteBinaria
>> ------------------------------------
>> II Hack'n Rio - 23 e 24/11
>> hacknrio.org
>> ------------------------------------
>>
>> 2012/1/15 Alysson Gonçalves de Azevedo <address@hidden>
>>
>> > **
>>
>> >
>> >
>> > Ola pessoal, mais uma vez amolando vocês aqui, mas segue a nova versão do
>> > programinha: http://pastebin.com/xT4ySeku
>> > Com relação à funcionalidade do programa, acho que já está ok (inclusive
>> eu
>> > dei um jeito de colocar o yad bunitinho junto).
>> >
>> > IFS="
>> > > "
>> > >
>> > > #NAUTILUS_SCRIPT_SELECTED_FILE_PATHS é a lista de todos os arquivos
>> > > selecionados, por isso é necessário tratar eles com um for
>> > > for SELECTED in ${NAUTILUS_SCRIPT_SELECTED_FILE_PATHS}; do
>> >
>> > > #Muda o dir corrente para o dir passado por parametro e então extrai
>> > > os arquivos la
>> > > [ -d ${SELECTED} ] && cd ${SELECTED} || cd "`dirname "${SELECTED}"`"
>> > >
>> > > #Lista os arquivos a serem descompactados, se for um arquivo, retorna
>> > > ele mesmo, se for uma pasta, retorna os arquivos dentro dela
>> > > FILES=`ls ${SELECTED} | grep -E '\.(zip|rar|7z|7z\.001)$' | grep -Ev
>> > > '\.part([1-9][[:digit:]]|[[:digit:]]*(0|[2-9]))\.rar$'`
>> > > #O segundo grep exclui arquivos.partN.rar, onde N não seja 1,01,001 e
>> > > etc.
>> > >
>> > > #Extrai cada arquivo da lista
>> > > for NOME in ${FILES}; do
>> > > echo "#${NOME##/*/}" #Mostra o nome do arquivo no display de
>> > > progresso do yad
>> > > 7z x -y "${NOME}"
>> > > done
>> > > done | \
>> > > yad --title="yXtractor" --text="Extraindo arquivos..." --progress
>> > > --pulsate --no-buttons --auto-close --width=300 #--undecorated
>> > >
>> >
>> > a minha duvida ficou no trecho:
>> > FILES=`ls ${SELECTED} | \
>> > * grep -E '\.(zip|rar|7z|7z\.001)$' | \
>> > grep -Ev '\.part([1-9][[:digit:]]|[[:digit:]]*(0|[2-9]))\.rar$'*`
>>
>> >
>> > esse trecho serve para retornar arquivos completos e divididos, assim:
>> > "arquivo1.rar", "arquivo2.part1.rar", "arquivo3.part001.rar" mas que
>> ignore
>> > "arquivo2.part2.rar" ou "arquivo3.part010", por exemplo.
>> >
>> > a questão é... tem como encurtar esse trecho? talvez um awk ou outra
>> > coisa... eu até dei uma googlada, mas eu não sei exatamente quais termos
>> > procurar...
>> >
>> > desde já agradeço.
>> >
>> >
>> > Alysson Gonçalves de Azevedo
>> > (11) 8491-7730
>> >
>> > Em 15 de janeiro de 2012 13:29, Alysson Gonçalves de Azevedo <
>> >
>> > address@hidden> escreveu:
>> >
>> > > Hehe, bem, o seu livro ta na lista pra eu comprar...
>> > > mas como comecei a fazer o script já era 2h da manhã, não tinha
>> livraria
>> > > aberta...
>> > >
>> > > mas enfim, por enquanto eu vou usar a versão simples e depois, quando
>> > > tiver tempo, eu descubro como usar o Yad.
>> > >
>> > > Vlw o/.
>> > >
>> > >
>> > > Alysson Gonçalves de Azevedo
>> > > (11) 8491-7730
>> > >
>> > >
>> > >
>> > > Em 15 de janeiro de 2012 12:22, Julio C. Neves <address@hidden
>> > >escreveu:
>> > >
>> > > Fala Alisson,
>> > >> tenho algumas observações acerca do seu script:
>> > >>
>> > >> A partir do Bash 4.0 vc tem o cmd coproc, para fazer thread. Dê
>> > >> preferência
>> > >> a usá-lo no seu script;
>> > >>
>> > >> Como vc não usa o IFS diferente de <ENTER>, não precsa salvá-lo nem
>> > >> restaurá-lo, pois será automaticamente restaurado ao final do sript;
>> > >>
>> > >> Eu trocaria:
>> > >>
>> > >> for SELECTED in `find ${NAUTILUS_SCRIPT_SELECTED_FILE_PATHS} -type f
>> > >> -maxdepth 1 -regex
>> > >> ".*\(zip\|rar\|7z\|tar\|gz\|bz2\|tar.gz\|tar.bz2\|lzma\)$"`
>> > >>
>> > >> por:
>> > >>
>> > >> for SELECTED in `grep -E
>> > \.(zip|rar|7z|tar|gz|bz2|tar.gz|tar.bz2|lzma)$"`
>> > >>
>> > >> Por ser mais curto e mais rápido e rodar em qq plataforma.
>> > >>
>> > >> Amigo, nunca nessa lista ninguém me ouviu falar para comprar meu
>> livro,
>> > já
>> > >> que publiquei outro na Internet.
>> > >>
>> > >> Agora publiquei um sobre interfaces gráficas, que abrange o dialog,
>> > >> kdialog, zenity e YAD. Escrevi esse livro pq precisei usar zenity e
>> > >> descobri que não existe documentação completa (nem no man) e tive de
>> > >> aprendê-lo pelo código. Essa característica é comum a todos.
>> > >>
>> > >> Não creio que exista literatura sobre esses 4 sws tão completa em
>> nenhum
>> > >> idioma qto o Bombando o Shell (pelo menos em português e inglês não
>> > >> existe,
>> > >> só se estiver muito bem escrito).
>> > >>
>> > >> O YAD merece esse investimento. É uma revolução em todas as interfaces
>> > >> gráficas é o que se fez de mais significante desde o TK (que
>> > infelizmente
>> > >> não foi portado para o Shell, mas tenho ideia de fazê-lo em 2012).
>> > >>
>> > >> O Raimundo assistiu uma palestra minha (no CONSEGI em BSB) e gostou
>> > tanto
>> > >> do sw que escreveu o artigo sobre YAD que vc leu. O YAD é muito
>> > completo e
>> > >> está com uma evolução a jato. Quem gosta de shell não pode ignorá-lo.
>> > >>
>> > >> Abcs,
>> > >> Julio
>> > >> *Já foi lançado "Bombando o
>> > >> Shell<
>> > >>
>> >
>> http://www.brasport.com.br/index.php?dispatch=products.view&product_id=666
>> > >> >
>> > >> ". *
>> > >> *Show **de interfaces gráficas sob Shell!*
>> > >> *
>> > >> *
>> > >>
>> > >>
>> > >>
>> > >> Em 15 de janeiro de 2012 02:33, Alysson Gonçalves de Azevedo <
>> > >> address@hidden> escreveu:
>> > >>
>> > >> > **
>> > >> >
>> > >> >
>> > >> > Salve pessoal (que fica até de madrugada brincando com shell)!
>> > >> >
>> > >> > Bem, outro dia eu mandei um email da lista, sobre problemas com
>> > >> codificação
>> > >> > nos nomes do arquivos e talz.
>> > >> > Acontece que eu percebi que eu só tenho aquele problema quando eu
>> uso
>> > o
>> > >> > programa padrão do gnome, através da opção "Extrair aqui", no menu
>> de
>> > >> > contexto do nautilus.
>> > >> > Quando eu descompacto esses mesmos arquivos pelo terminal, usando
>> > >> programas
>> > >> > como gzip, tar e 7z, eu não tenho esse problema.
>> > >> >
>> > >> > Com isso, decidi montar meu próprio script <
>> > >> http://pastebin.com/6rgRUgVL>,
>> > >> > nesse link, o programa já extrai os arquivos selecionados, ou se for
>> > uma
>> > >> > pasta, ele descompacta recursivamente, e etc.
>> > >> > Até aqui foi fácil.
>> > >> >
>> > >> > Agora, como descompactar muitos arquivos pode ser "demorado", eu
>> > pensei
>> > >> eu
>> > >> > colocar o yad no meio... (como eu não sei usar nem yad, nem zenity,
>> > >> resolvi
>> > >> > começar pelo primeiro).
>> > >> >
>> > >> > Seguindo esse exemplo<
>> > >> >
>> > >>
>> >
>> http://www.vivaolinux.com.br/artigo/Yad-016-Eu-quero-sempre-mais-de-ti/?pagina=4
>> > >> > >,
>> > >> > eu gostaria que ao executar o script, uma tela de acompanhamento
>> fosse
>> > >> > exibida, para o usuário saber se ainda está descompactando ou se já
>> > >> acabou.
>> > >> >
>> > >> > Segue minha versão adaptada:
>> > >> >
>> > >> > > # Para funcionar, salve este arquivo com um nome qualquer no
>> > >> diretório:
>> > >> > > # "~/.gnome2/nautilus-scripts/"
>> > >> > > # O nome que colocar no arquivo será Exibido no menu de contexto
>> do
>> > >> > > Nautilus.
>> > >> > > #
>> > >> > > # Para utilizar, basta apenas selecionar os arquivos, clique com o
>> > >> botão
>> > >> > > direito,
>> > >> > > # opção Scripts, clicar na opção com o nome desse script.
>> > >> > >
>> > >> > > OLDIFS=${IFS}
>> > >> > > IFS="
>> > >> > > "
>> > >> > > dcompact(){
>> > >> > > #Muda o dir corrente para o dir passado por parametro e então
>> extrai
>> > >> > > os arquivos la
>> > >> > > [ -d ${1} ] && cd ${1} || cd "`dirname "$1"`"
>> > >> > > #Lista os arquivos a serem descompactados
>> > >> > > FILES=`find $1 -maxdepth 1 -type f -regex
>> > >> > > ".*\(zip\|rar\|7z\|tar\|gz\|bz2\|tar.gz\|tar.bz2\|lzma\)$"`
>> > >> > > #Contador
>> > >> > > i=0
>> > >> > > for FNOME in ${FILES}
>> > >> > > do
>> > >> > > 7z x -y "${FNOME}" & PID=$!;
>> > >> > > QTD=$(ps aux | egrep "$PID.*" | wc -l)
>> > >> > > while [ ${QTD} -eq 1 ]
>> > >> > > do
>> > >> > > i=$((i+1))
>> > >> > > QTD=$(ps aux | egrep "$PID.*" | wc -l)
>> > >> > > sleep 0.25
>> > >> > > echo "$i"
>> > >> > > done
>> > >> > > done
>> > >> > > killall yad
>> > >> > > exit 0
>> > >> > > }
>> > >> > > dcompact ${NAUTILUS_SCRIPT_SELECTED_FILE_PATHS} \
>> > >> > > | yad --multi-progress --title='Extrair aqui'
>> --button='Cancelar':1
>> > >> > > --bar="Extraindo-os...":NORM 5
>> > >> > >
>> > >> > > IFS=${OLDIFS}
>> > >> > >
>> > >> >
>> > >> > Com esse script, a janelinha do Yad aparece e já some na sequencia
>> (eu
>> > >> não
>> > >> > acredito que meu note seja tão rápido pra descompactar 4 arquivos de
>> > >> 200mb
>> > >> > cada em menos de 1s).
>> > >> >
>> > >> > O meu problema é: eu não achei uma documentação como usar o yad, e
>> > >> apenas
>> > >> > tentar adaptar não deu resultado.
>> > >> > Alguém ai consegue me dar alguma dica, por menor que seja?!
>> > >> >
>> > >> > Obrigado.
>> > >> >
>> > >> > Alysson Gonçalves de Azevedo
>> > >> > (11) 8491-7730
>> > >> >
>> > >> > [As partes desta mensagem que não continham texto foram removidas]
>> > >> >
>> > >> >
>> > >> >
>> > >>
>> > >>
>> > >> [As partes desta mensagem que não continham texto foram removidas]
>> > >>
>> > >>
>> > >>
>> > >> ------------------------------------
>> > >>
>> > >> ----------------------------------------------------------
>> > >> Esta lista não admite a abordagem de outras liguagens de programação,
>> > >> como perl, C etc. Quem insistir em não seguir esta regra será moderado
>> > sem
>> > >> prévio aviso.
>> > >> ----------------------------------------------------------
>> > >> Sair da lista: address@hidden
>>
>> > >> ----------------------------------------------------------
>> > >> Esta lista é moderada de acordo com o previsto em
>> > >> http://www.listas-discussao.cjb.net
>> > >> ----------------------------------------------------------
>> > >> Servidor Newsgroup da lista: news.gmane.org
>> > >> Grupo: gmane.org.user-groups.programming.shell.brazil
>> > >>
>> > >> Links do Yahoo! Grupos
>> > >>
>> > >>
>> > >>
>> > >
>> >
>> > [As partes desta mensagem que não continham texto foram removidas]
>> >
>> >
>> >
>>
>> [As partes desta mensagem que não continham texto foram removidas]
>>
>>
>>
>
>
> [As partes desta mensagem que não continham texto foram removidas]
>
>
>
> ------------------------------------
>
> ---------------------------------------------------------------------
> Esta lista não admite a abordagem de outras liguagens de programação, como 
> perl, C etc. Quem insistir em não seguir esta regra será moderado sem prévio 
> aviso.
> ---------------------------------------------------------------------
> Sair da lista: address@hidden
> ---------------------------------------------------------------------
> Esta lista é moderada de acordo com o previsto em 
> http://www.listas-discussao.cjb.net
> ---------------------------------------------------------------------
> Servidor Newsgroup da lista: news.gmane.org
> Grupo: gmane.org.user-groups.programming.shell.brazil
>
> Links do Yahoo! Grupos
>
>


reply via email to

[Prev in Thread] Current Thread [Next in Thread]