Ajuda com shell script [RESOLVIDO]

1. Ajuda com shell script [RESOLVIDO]

ian cléver sales fernandes
ianclever

(usa Arch Linux)

Enviado em 21/03/2014 - 01:07h

estou fazendo um script aqui(meu primeiro) , até já programo em c portanto só basta assimilar algumas coisas, é que fiz um besteira hoje de testar um comando aqui na minha pasta de usuário, isso acabou deletando todos os arquivos da pasta de usuário do arch, minha salvação foi que tenho o openmandriva em outra partição através dele usei o photorec para recuperar o que foi perdido, mudei os filtros dele para caçar só os arquivos que me interessam, mas mesmo assim ele gera muitas pastas e vou precisar fazer um filtro maior, para ficar pelo menos um pouco mais fácil de achar o que me interessa.


como não tenho muita prática fiz o seguinte:



#!/bin/sh
cd /home/meu_usuario/temp;
diretorio="recup_dir.";
var= "!(*.c|*.h|*.bin|*.pdf|*.odt|*.odp|*.doc|*.docx|*.ppt|*.pptx|*.svg)";
for cont in {1..60};
do
cd $diretorio$cont;
rm -f $var;
cd .. ;
done


na linha rm -f $var; ele diz que parâmetro passado pela variável $var, não foi encontrado, mas se eu executar manualmente vai, o que pode ser?


  


2. Re: Ajuda com shell script [RESOLVIDO]

Renato Carneiro Pacheco
renato_pacheco

(usa Debian)

Enviado em 21/03/2014 - 08:53h

Cara, eu acho q, por causa dos caracteres especiais, não tá indo como deveria. Tente assim:

...
var=""!(*.c|*.h|*.bin|*.pdf|*.odt|*.odp|*.doc|*.docx|*.ppt|*.pptx|*.svg)";"
...


Se não der certo, execute o seu script com o comando bash -x script.sh pra debugar onde está o problema.


3. Re: Ajuda com shell script [RESOLVIDO]

Carlos Alberto Mazzer
cmazzer

(usa Ubuntu)

Enviado em 21/03/2014 - 09:26h

Bom dia,

Dicas:
- Sempre utilize os caminhos completos das pastas e arquivos, nunca utilize o comando "cd" para ir na pasta.
- Na hora de rodar um comando também utilize o caminho completo ex. /bin/rm

Exemplo

#!/bin/bash
# Declare uma variável com o nome do local de pesquisa
DIRETORIO_PESQUISA=/home/usuario/pesquisa

# Utilize o comando find para procurar todos os arquivos xls e doc nesta pasta, e coloque o resultado em um array "RESULTADO"
RESULTADO=`find $DIRETORIO_PESQUISA -regex ".*\.\(xls\|doc\)$"`

# Faça um 'FOR' que percorra todo o array e utilize o comando que quiser com o caminho completo
for t in "${RESULTADO[@]}"
do
echo "`/bin/ls -l $t`"
done



4. Re: Ajuda com shell script [RESOLVIDO]

ian cléver sales fernandes
ianclever

(usa Arch Linux)

Enviado em 21/03/2014 - 12:52h

renato_pacheco escreveu:

Cara, eu acho q, por causa dos caracteres especiais, não tá indo como deveria. Tente assim:

...
var=""!(*.c|*.h|*.bin|*.pdf|*.odt|*.odp|*.doc|*.docx|*.ppt|*.pptx|*.svg)";"
...


Se não der certo, execute o seu script com o comando bash -x script.sh pra debugar onde está o problema.


tentei não deu certo de primeira e segui a dica do outro colega que tb não deu certo de primeira, então eu dei uma pesquisada e adaptei algumas coisinhas, agora ele já tá filtrando os arquivos que eu quero que fique e eu estou tentando concatenar eles em um rm -f "!(arquivo1|arquivo2| ...)" mas não dá certo vejam:


#!/bin/bash

DIRETORIO_PESQUISA=/home/usuario/temp/

RESULTADO=`find $DIRETORIO_PESQUISA -regextype posix-egrep -iregex ".*\.(h|c|odp|odt|pdf|ppt|pptx)$"`

nao_remova='rm -f "!(';
for t in "${RESULTADO[@]}"
do
nao_remova+= $t;
nao_remova+="|";
done
nao_remova+=')"';
echo $nao_remova;


aí ao invés de sair como eu quero tá fazendo assim:

rm -f "(arquivo1 ....|) o | tá ficando só no final e sem o fechamento de aspas

e em baixo aparece rm -f "!()"


como resolvo?






5. Re: Ajuda com shell script [RESOLVIDO]

Carlos Alberto Mazzer
cmazzer

(usa Ubuntu)

Enviado em 22/03/2014 - 10:42h

Qual o seu objetivo final ? Remover quais arquivos ?

Ao invés de você tentar montar um comando rm com vários parâmetros. O Correto é rodar dentro do for vários comandos rm utilizando a lista de arquivos.

ex.

rm -f /home/usuario/temp/arquivo1.doc
rm -f /home/usuario/temp/arquivo2.c
...




6. Re: Ajuda com shell script [RESOLVIDO]

ian cléver sales fernandes
ianclever

(usa Arch Linux)

Enviado em 22/03/2014 - 15:06h

remover tudo menos os arquivos com extensões:


*.c
*.h
*.bin
*.odt
*.odp
*.pdf
*.ppt
*.pptx



que em um comando direto ficaria algo do tipo:

rm -f !(*.c|*.h|*.bin|*.odt|*.odp|*.pdf|*.ppt|*.pptx)




7. Re: Ajuda com shell script [RESOLVIDO]

Fernando
phoemur

(usa Debian)

Enviado em 22/03/2014 - 20:22h

Eu sempre gostei do find ao invés de usar scripts com for. Assim funcionará:


find /home/usuario/temp/ -type f -regextype posix-egrep -not -iregex ".*\.(h|c|odp|odt|pdf|ppt|pptx)$" -exec rm -f {} \;


Agora me parece que no seu script o problema seriam as aspas que estão expandindo o conteúdo da variável...

Outra coisa que no shellscript você não precisa colocar ponto e vírgula no fim de todas as linhas como em C ...
O ponto e vírgula é pra usar dois comandos na mesma linha.

Pra usar dois comandos na mesma linha, executando o segundo apenas se o primeiro tiver sucesso use &&
Ex.: sudo apt-get update && sudo apt-get upgrade

Pra usar dois comandos na mesma linha executando o segundo apenas se o primeiro falhar use ||
Ex.: ls file.txt || echo "arquivo não encontrado"

Pra usar dois comandos na mesma linha, independente do primeiro, use ;
Ex.: echo 1; echo 2; echo3

pra usar o seu script inicial você teria que parar a expansão do conteúdo da variável usando shopt e depois reativar, mais ou menos assim:


#!/bin/bash

shopt -u extglob
var='!(*.c|*.h|*.bin|*.odt|*.odp|*.pdf|*.ppt|*.pptx)'
shopt -s extglob

cd /home/meu_usuario/temp
for cont in {1..60}; do
cd $diretorio$cont
rm -f $var
cd ..
done


Agora o find é o jeito melhor pra se fazer na minha humilde opinião...
Aliás, o find é o meu comando predileto kkk canivete suiço para operações com arquivos...


8. Re: Ajuda com shell script [RESOLVIDO]

ian cléver sales fernandes
ianclever

(usa Arch Linux)

Enviado em 22/03/2014 - 22:08h

galera agradeço a atenção, prometo que vou dar mais uma lida sobre o find, fiquei um bom tempinho sem entrar aqui e acabei resolvendo de um jeito mais a lá gambiarra que o find mas funfou





  



Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts