Autor Tópico: Ajuda num shell script de 5 linhas  (Lida 12918 vezes)

Offline LedStyle

  • Usuário Ubuntu
  • *
  • Mensagens: 1.345
    • Ver perfil
    • http://www.tuxresources.org
Ajuda num shell script de 5 linhas
« Online: 15 de Fevereiro de 2006, 05:37 »
Parece piada mas num estou conseguindo extrair os arquivos dum diretório. Tem uns 2000 arquivos ".rar" nesse diretório e eu não estou nem um pouco afim de extrair um por um. Ao selecionar todos e mandar extrair o nautilus trava...

Então la fui eu pro script. Mas não consigo ver o que tem de errado:

Código: [Selecionar]
#!/bin/bash
ORIGEM=$1

for i in `ls $ORIGEM`;
do
echo "Extraindo $i"
unrar e $i
done


Eu executo e ele imprime o echo mas não extrai nada :(

Offline LedStyle

  • Usuário Ubuntu
  • *
  • Mensagens: 1.345
    • Ver perfil
    • http://www.tuxresources.org
Ajuda num shell script de 5 linhas
« Resposta #1 Online: 15 de Fevereiro de 2006, 05:47 »
Ahhh detectei o problema. Mas não sei solucionar. O problema é que tem "espaços" no nome do arquivo. Então se o arquivo chama:

meu arquivo.rar

Ele vai dar os comandos:

rar e meu
rar e arquivo.rar

Ai num rola. Alguém sabe como contornar?

Ei tenho uma idéia de contornar... se eu der um "ls -l | cut -d ???? -f 2" sendo que o "????" seria um caractere que simboliza o espaço. Alguém sabe qual o caractere que simboliza o "espaço"?

Offline AlexBR

  • Usuário Ubuntu
  • *
  • Mensagens: 388
    • Ver perfil
Ajuda num shell script de 5 linhas
« Resposta #2 Online: 15 de Fevereiro de 2006, 07:19 »
Já tive esse problema uma vez. :-) Não me recordo bem como fiz pra resolver, mas acho que você tem que substituir unrar e $i por unrar e "$i". Tenta aí!

Boa sorte!

Offline unfear

  • Usuário Ubuntu
  • *
  • Mensagens: 223
    • Ver perfil
Ajuda num shell script de 5 linhas
« Resposta #3 Online: 15 de Fevereiro de 2006, 12:48 »
EDITADO

bah, que viajem, aqui deu certo seu primeiro script, já o meu não deu certo rsrs, esqueci como fiz, mas o meu sempre verificava se havia algum .zip e se havia ele descompactava, só que ai eu precisava enviar os ja descompactados para um outro lugar

Offline LedStyle

  • Usuário Ubuntu
  • *
  • Mensagens: 1.345
    • Ver perfil
    • http://www.tuxresources.org
Ajuda num shell script de 5 linhas
« Resposta #4 Online: 15 de Fevereiro de 2006, 13:21 »
Olha só... eu ja tentei colocar aspas ali no $i mas não adianta nada. La no laço ele ja vem com o nome quebrado então não adianta nada.

Alguém teria um script que renomeia todos arquivos trocando o espaço por "_"?

temp.

  • Visitante
Ajuda num shell script de 5 linhas
« Resposta #5 Online: 15 de Fevereiro de 2006, 13:25 »
não é só colocar unrar *.rar?

não lembro mto bem o shell script mas tenta colocar isso no meio do código, talvez vc tenha q mudar o for. Mas seilah xD

Offline unfear

  • Usuário Ubuntu
  • *
  • Mensagens: 223
    • Ver perfil
Ajuda num shell script de 5 linhas
« Resposta #6 Online: 15 de Fevereiro de 2006, 15:17 »
Led passa teu email por PM, eu tenho um script de renomear todos

Offline unfear

  • Usuário Ubuntu
  • *
  • Mensagens: 223
    • Ver perfil
Ajuda num shell script de 5 linhas
« Resposta #7 Online: 15 de Fevereiro de 2006, 15:21 »
bom, acho que se o cara tava distribuindo este script pela net ele não se incomdará de posta-lo aqui, claro mantendo seus direitos autorais e não modificando o script

Editado
Legal, Liberado, mandei um e-mail pra ele e ele libero
Código: [Selecionar]
#!/bin/bash
#############################################################################
# Titulo     : rename
# Autor      : J. F. Mitre <jf_mitre@yahoo.com.br>
# Data       : 31 de Janeiro de 2005, Segunda-Feira
# Requisitos :
# Categoria  : Tools
#############################################################################
# Descrição  :
#    - Renomear arquivos múltiplos, seguindo regras.
#
#############################################################################
# Uso :
#     rename [opcoes] arquivos
#     rename -h : para o help
#############################################################################
#    2005/01/31 - Criação do Script rename
#############################################################################


#############################################################################
#
# Função com a descrição dos princiais recursos do Script
#
#############################################################################

usage(){
echo "
-----------------------------------------------------------------------------
 Titulo     : rename
 Autor      : J. F. Mitre <jf_mitre@yahoo.com.br>
 Data       : 31 de Janeiro de 2005, Segunda-Feira
 Requisitos :
 Categoria  :
-----------------------------------------------------------------------------
 Descrição :
    - Renomea arquivos em lote
   
-----------------------------------------------------------------------------
 Uso :
    $(basename $0) [opcoes]
-----------------------------------------------------------------------------
 Opções:
    -h|--help       - Imprime este texto de ajuda
   
    -p|--prefix     - Acrescenta prefixo
    -s|--sufix      - Acescentra sufixo
   
    -n|--nome       - Modifica a base do nome
                      A ausência desse parâmetro mantêm o núcleo do nome do
                      arquivo original
   
    -c|--cont       - Adiciona contador ao prefixo/nome/sufixo/contador
                      Esse contador é simples e sem argumentos
                     
    -e|--ext        - Modifca extensão
                      A ausência mantêm a extensão atual
     
  Argumentos das opções
    -p|--prefix     - Expressão a ser acrescentada no prefixo do nome
    -p|--prefix     - Expressão a ser acrescentada no sufixo do nome
    -n|--nome       - Um novo nome (núcleo) para os arquivos
    -e|--ext        - Nova extensão dos arquivos
   
       
-----------------------------------------------------------------------------
 Ex.:
    $(basename $0) -c -p linux_ -s _doc *
        Acrescenta um contador
        Adiciona a palavra linux_ a todos os arquivos no começo
        Adiciona a palavra _doc ao final de todos os arquivos
       
    $(basename $0) -c -e .jpg -n palhaço *
        Todos os arquivos receberão .jpg como extensão
        Serão todos \"palhaço\"(NUMERO_VARIANDO).jpg
   
    $(basename $0) -h
       
-----------------------------------------------------------------------------
    Notas :
        - Para evitar erros, uma vez usado o programa, não será permitido
          usar o programa novamente no mesmo lugar enquanto não for removido
          os arquivos de backup não forem removidos MANUALMENTE.
          No futuro haverá uma opção simples para checagem do resultado e se
          deseja remover o backup e haverá outro impondo a modificação de
          qualquer jeito, algo tipo -f|--force
   
        - Erros de chamada do script pode levar a resultados curiosos
          Ex. -n -c linux -e jpg
          Todas as palavras serão chamadas -c e não terão contadores, ora
          isso promoverá sobrescrição dos arquivos, que podem ser recuperados
          na pasta \"backup_original\" no mesmo diretório que contém os
          arquivos.
                   
        - O contador utilizado nessa versão acrescenta números simples,
          ou seja, 1, 2, ... 10, 99, 100. Eles não possuem 0 (ZEROS) para
          uma numeração uniforme, e portanto podem não ter o resultado
          esperado de ordenação, o objetivo de numerar os arquivos têm com o
          único objetivo de diferenciá-los, além disso esse contador somente
          pode ser usado em uma posição, depois do sufixo/antes da extensão
          Isso deve vir a ser modificado no futuro
         
        - Se o programa for chamado da forma $(basename $0) <arquivos>, nada
          acontecerá, essa é uma forma bem diferente de fazer uma cópia dos
          arquivos de uma pasta em uma pasta chamada \"backup_original\"
          Esse será o único efeito final, entretanto os arquivos serão todos
          \"renomeados\" do tipo mv nomeatual nomeatual, portanto, a chamada do
          script sem argumentos, mesmo não tendo resultados visuais posterior
          poderá demorar em pastas grandes
         
        - FAÇA BACKUP DE TODOS OS ARQUIVOS QUE VIVER A SOFRER UMA MODIFIÇÃO
          ATRAVÉS DESSE SCRIPT. Não apenas devido a bugs e afins, mas também
          por causa da forma como que é feito, ou seja, sem perceber o usuá-
          rio pode ter criado um expressão que seja o nome de um dos arquivos
          originais. Sua única garantia interna é o backup feito pelo script,
          mas se algo der errado nesse backup é melhor que tenha feito o seu
          antes. Pense bem, dá menos trabalho copiar os arquivo e depois usar
          o script do que renomear todos um a um.  
-----------------------------------------------------------------------------
"
}
#############################################################################

#----------------------------------------------------------------------------
# Imprime o Help no caso do primeiro argumento ser: -h ou --help
#----------------------------------------------------------------------------
if [ $# != 0 ];then
    if [ $1 == -h -o $1 == --help ]; then
        usage |less
        exit
    fi
fi
#----------------------------------------------------------------------------

#----------------------------------------------------------------------------
# Caso o script precise de argumentos
#----------------------------------------------------------------------------
if [ $# == 0 ];then
    usage |less
    exit
fi
#----------------------------------------------------------------------------

#############################################################################
#  
#   ZONA DE CONFIGURAÇÃO DO SCRIPT
#----------------------------------------------------------------------------
# Variáveis de script
#----------------------------------------------------------------------------
BINDIR=$HOME/bin           # Diretório de arquivo binários
NULLOUT=/dev/null          # Saída nula
DATA=$(date +%Y-%m-%d)     # Data formatada adequadamente
IN=$*                      # Inputs (argumentos de linha)
NUMIN=$#                   # Número total de argumentos
PROGNAME=$(basename $0)

#----------------------------------------------------------------------------
# Arquivo(s) Temporário(s)
#----------------------------------------------------------------------------

ATMP=$(mktemp /tmp/tmp.$PROGNAME.XXXXXXXX) || exit 1
#BTMP=$(mktemp /tmp/tmp.$PROGNAME.XXXXXXXX) || exit 1
#CTMP=$(mktemp /tmp/tmp.$PROGNAME.XXXXXXXX) || exit 1
#DTMP=$(mktemp /tmp/tmp.$PROGNAME.XXXXXXXX) || exit 1
#ETMP=$(mktemp /tmp/tmp.$PROGNAME.XXXXXXXX) || exit 1
#FTMP=$(mktemp /tmp/tmp.$PROGNAME.XXXXXXXX) || exit 1
#GTMP=$(mktemp /tmp/tmp.$PROGNAME.XXXXXXXX) || exit 1
#HTMP=$(mktemp /tmp/tmp.$PROGNAME.XXXXXXXX) || exit 1


#############################################################################
#
#   Funções de sistema do script
#---------------------------------------------------------------------------
#       - Operações de identificação de objetivos e manutenção
#----------------------------------------------------------------------------
#       - Funções:
#           checkinput  - Checa e atribui identificação aos argumentos
#           removetmp   - Remove os arquivos temporários criados
#############################################################################

#----------------------------------------------------------------------------
# checkinput - Verifica e analisa quais as opções do script serão utilizadas
#----------------------------------------------------------------------------
 
checkinput(){
# Lista de controle :
#   0 (ZERO), desativado
#   1 (UM) ativado
#   2 (DOIS) ativado com argumentos

p_STATUS=0  # - Prefixo do nome
s_STATUS=0  # - Sufixo do nome
n_STATUS=0  # - Nome
c_STATUS=0  # - Contador
e_STATUS=0  # - Extensão

# Inicialização das variáveis
PREFIX=
SUFIX=
nome=
ext=


for j in $IN; do
   
    # Captando os argumentos das opções
    if [ $p_STATUS == 1 ]; then p_STATUS=2; PREFIX=$j; fi
    if [ $s_STATUS == 1 ]; then s_STATUS=2; SUFIX=$j; fi
    if [ $n_STATUS == 1 ]; then n_STATUS=2; nome=$j; fi
    if [ $e_STATUS == 1 ]; then e_STATUS=2; ext=$j; fi
   
       
    [ $j == -p ] &&  p_STATUS=1
    [ $j == -s ] &&  s_STATUS=1
    [ $j == -n ] &&  n_STATUS=1
    [ $j == -c ] &&  c_STATUS=1
    [ $j == -e ] &&  e_STATUS=1

    # ORIG : arquivos a serem renomeados
    [ -f "$j" ] && ORIG=$ORIG\ $j
   
done
}
#----------------------------------------------------------------------------

#----------------------------------------------------------------------------
# removetmp - Remove TODOS os arquivos temporários criados no Script
#----------------------------------------------------------------------------

removetmp(){
    rm -f /tmp/tmp.$PROGNAME.XX*
}
#----------------------------------------------------------------------------

#############################################################################
#
#   Funções do Script
#----------------------------------------------------------------------------
#       - Todo o Trabalho é executado apenas na MAIN
#############################################################################


#############################################################################
#
#   MAIN FUNCTION
#      - Responsável pela inicialização do script
#############################################################################

main(){
checkinput      # Obtem as informações de opções e argumentos

#---------------------------------------------------------------------------
if [ -d "backup_original" ]; then
    echo "Existe uma pasta chamada: backup_original"
    echo "Remova ela antes de rodar o script"
    echo "Isso impedirá que erros na chamada do script ou idéias não tão bem"
    echo "sucedidas impliquem em perda dos arquivo"
    echo "\"O incomodo de hoje é o seu seguro de amanhã\""
    exit
fi
 mkdir backup_original
 cp $ORIG backup_original/

if [ $c_STATUS == 1 ];then
CONT=0
fi

for k in $ORIG; do

    if [ $c_STATUS == 1 ];then
       CONT=$((1+CONT))
    fi
       
    if [ $n_STATUS != 2 ]; then
        # Nome original deve ser mantido
        # Tudo que estiver antes do primeiro "." é nome
        NOME=$(echo "$k"| cut -f 1 -d ".")
    else  
        NOME=$nome
    fi    

    if [ $e_STATUS != 2 ]; then
        # A extensão deve ser mantida
        # Tudo que estiver depois do primeiro "." é extesão
         EXT=.$(echo "$k"| cut -f 2- -d ".")
    else
         EXT=$ext
    fi      
   
    mv $k "$PREFIX""$NOME""$SUFIX""$CONT""$EXT"
done
#---------------------------------------------------------------------------

}

# Inicializando o Script - Chamando a função main
main

# remove os arquivo temporário
# será usado em versões futuras
removetmp


Offline LedStyle

  • Usuário Ubuntu
  • *
  • Mensagens: 1.345
    • Ver perfil
    • http://www.tuxresources.org
Ajuda num shell script de 5 linhas
« Resposta #8 Online: 15 de Fevereiro de 2006, 18:40 »
Valeu unfear...

Porém eu estava olhando aqui esse script só acrescenta coisas ao nome eu acho... Nãoi achei opção pra remover os espaços no nome :(

Será que eu não estou sabendo usar?

Offline unfear

  • Usuário Ubuntu
  • *
  • Mensagens: 223
    • Ver perfil
Ajuda num shell script de 5 linhas
« Resposta #9 Online: 15 de Fevereiro de 2006, 19:28 »
é realmente isso eu não sei ao certo :S

Offline GDA

  • Usuário Ubuntu
  • *
  • Mensagens: 92
    • Ver perfil
Re: Ajuda num shell script de 5 linhas
« Resposta #10 Online: 16 de Fevereiro de 2006, 06:02 »
Oi Led... tenta isso:

Código: [Selecionar]
#!/bin/bash
for file in *.rar
do
 n=$(echo ${file} | tr " " "_");
 echo "Novo nome é $n"
done


O "tr" faz isso facilmente... dá um man tr aí pra ver o monte de opção que tem.

Abração!
jabber: droopalong@jabber.org - Ubuntu'ser:
Interessado em aprender mais sobre o Ubuntu em português? Comece aqui

Offline LaSSarD

  • Usuário Ubuntu
  • *
  • Mensagens: 1.144
    • Ver perfil
Ajuda num shell script de 5 linhas
« Resposta #11 Online: 16 de Fevereiro de 2006, 10:42 »
É só botar o $i entre aspas :shock:
Eu fazia assim pra converter de .ico pra .png umas pastas que tinham vários arquivos com espaços:
Código: [Selecionar]
cd pasta; for i in *; do convert "$i".ico "$i".png
desculpem as mensagens não respondidas, mas eu tô afastado há mais de ano...
um dia eu volto ;)

Offline GDA

  • Usuário Ubuntu
  • *
  • Mensagens: 92
    • Ver perfil
Ajuda num shell script de 5 linhas
« Resposta #12 Online: 16 de Fevereiro de 2006, 17:35 »
Lassard,

acho que não... Quer dizer, no seu caso eu acho que dava certo por conta do "convert", mas nem todo programa/comando trata os argumentos da mesma forma, e aí tem de renomear mesmo.

Abração
jabber: droopalong@jabber.org - Ubuntu'ser:
Interessado em aprender mais sobre o Ubuntu em português? Comece aqui

Offline mariomeyer

  • Official Ubuntu Member
  • Usuário Ubuntu
  • *****
  • Mensagens: 62
    • Ver perfil
    • http://blog.meyer.eti.br/
Ajuda num shell script de 5 linhas
« Resposta #13 Online: 17 de Fevereiro de 2006, 20:23 »
Citação de: "LedStyle"
Ei tenho uma idéia de contornar... se eu der um "ls -l | cut -d ???? -f 2" sendo que o "????" seria um caractere que simboliza o espaço. Alguém sabe qual o caractere que simboliza o "espaço"?


Depende...

Decimal: 32
Hexa: 040
Octal:  20

qnd precisar, "man ascii" ;)

Mário Meyer
Ubuntu Member

Offline unfear

  • Usuário Ubuntu
  • *
  • Mensagens: 223
    • Ver perfil
Ajuda num shell script de 5 linhas
« Resposta #14 Online: 27 de Fevereiro de 2006, 12:39 »
bom queria tirar um duvida hehe, eu tava com este script de descompactação, lembro que no ubuntu 5.04 ach oqeu nao dava para você selecionar todos e clicar com o direito e selecionar extrair, isso é certo? bom eu fiz aqui no 5.10 e ele descompctou tudo