Ajuda num shell script de 5 linhas

Iniciado por LedStyle, 15 de Fevereiro de 2006, 05:37

tópico anterior - próximo tópico

LedStyle

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:

#!/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 :(

LedStyle

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"?

AlexBR

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!

unfear

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

LedStyle

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.

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

unfear

Led passa teu email por PM, eu tenho um script de renomear todos

unfear

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
#!/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


LedStyle

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?

unfear

é realmente isso eu não sei ao certo :S

GDA

Oi Led... tenta isso:

#!/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

LaSSarD

É 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:
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 ;)

GDA

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

mariomeyer

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

unfear

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