Fórum Ubuntu Linux - PT
Suporte Técnico => Programação e Scripts => Tópico iniciado por: LedStyle em 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:
#!/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 :(
-
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"?
-
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!
-
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
-
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 "_"?
-
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
-
Led passa teu email por PM, eu tenho um script de renomear todos
-
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
-
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?
-
é realmente isso eu não sei ao certo :S
-
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!
-
É 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
-
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
-
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" ;)
-
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
-
o \<espaço> simboliza um espaço exemplo:
vou entrar na pasta musicas que esta dentro de Meus documentos que esta no meu home:
cd /home/matheus/Meus\ documentos/musicas/
espero ter ajudado :-)