Pular para o conteúdo

Compactação de arquivos em uma determinada lista

Responder tópico
  • Denunciar
  • Indicar
01 02

1. Compactação de arquivos em uma determinada lista

Enviado em 20/07/2015 - 12:23h

Boa tarde amigos,

Meu primeiro tópico, desculpem se estou errando em algo.

Segue minha dúvida..
O conteúdo da pasta /lista são arquivos .txt...
Dentro destes arquivos .txt, contém diretórios como:
/mnt/
/tmp/

Esses diretórios são de servidores remotos. O local /mnt/server_alvo é um ponto de montagem no servidor remoto.

O que pretendo fazer é compactar os diretórios mencionados nesses arquivos. Para isso eu estou usando a expressão abaixo:
ARQUIVOS=`sed -n '2,$ p' /tmp/lista/*`
tar -zcpvf /mnt/server_alvo/root/scripts/$LISTA-$DATA.tar.gz /mnt/server_alvo/$ARQUIVOS

Porém só consigo compactar a primeira linha, as linhas restantes ele compacta do meu servidor local. Segue o resultado do log..

========
/mnt/server_alvo/teste/
/mnt/server_alvo/teste/oi
/tmp/
/tmp/.ICE-unix/
/tmp/servidores/
/tmp/servidores/backup_servidores.sh
========

Essas 4 ultimas linhas já são do meu servidor local. Alguém tem alguma idéia de como fazer?

Responder tópico

2. Re: Compactação de arquivos em uma determinada lista

Enviado em 20/07/2015 - 14:56h

olá,

posta o conteúdo real do arquivo que contem os dados que deseja compactar. pfvr

Abs
---
Eu Acredito, que ás vezes são as pessoas que ninguém espera nada que fazem as coisas que ninguém consegue imaginar.

--- Mestre dos Mestres - Alan Turing ---

3. Re: Compactação de arquivos em uma determinada lista

Enviado em 20/07/2015 - 15:13h

tonyhts escreveu:

olá,

posta o conteúdo real do arquivo que contem os dados que deseja compactar. pfvr

Abs
---
Eu Acredito, que ás vezes são as pessoas que ninguém espera nada que fazem as coisas que ninguém consegue imaginar.

--- Mestre dos Mestres - Alan Turing ---
Olá tonyhts..


O arquivo /tmp/lista/ contém (inicialmente) um arquivo server1.txt. Dentro deste arquivo, contém linhas com diretórios..
192.168.0.10
/teste/
/tmp/

Coloquei no sed para pular a primeira linha.. pois é o IP do servidor remoto. Ele pega esse IP, monta.. e depois sai varrendo em busca dos diretórios a serem copiados.
Eu consigo fazer isso na primeira linha do diretório, mas nas outras, ele pega do servidor local e não do meu ponto de montagem, que no caso é o /mnt/server_alvo



4. Re: Compactação de arquivos em uma determinada lista

Enviado em 20/07/2015 - 15:26h

para a solução completa, precisaria ver o resto do seu script, pois não vi onde/como seu script monta as os server ( a naum ser que ja estejam montados) Maaaaas especificamente falando da parte do seu codigo:
ARQUIVO=`sed -n '2,$ p' /tmp/lista/*`
tar -zcpvf /mnt/server_alvo/root/scripts/$LISTA-$DATA.tar.gz /mnt/server_alvo/$ARQUIVOS
Para resolver, precisa de um for. Assim:
for ARQUIVO in `sed -n '2,$ p' /tmp/lista/*`
do tar -zcpvf /mnt/server_alvo/root/scripts/$LISTA-$DATA.tar.gz /mnt/server_alvo/$ARQUIVO
done
Abs

---
Eu Acredito, que ás vezes são as pessoas que ninguém espera nada que fazem as coisas que ninguém consegue imaginar.

--- Mestre dos Mestres - Alan Turing ---

5. Re: Compactação de arquivos em uma determinada lista

Enviado em 21/07/2015 - 11:31h

tonyhts escreveu:
..
tonyhts, deu certo.. coloquei no for como vc disse e funcionou.

Agora a duvida é.. como faço pra inserir outro arquivo neste diretório com outro IP, com outros diretórios? Tentei inserir, mas durante a montagem ele deu erro.. ele juntou vários arquivos. Segue como faço pra montar..

echo 'Vou listar os servidores a serem backupeados..'
if ls -lh $SRV_LISTA ; then
echo -e
echo 'Lista OK, agora vou identificar o IP de cada servidor..'
LISTA=`head -1 $SRV_LISTA/*`
echo 'Identificado o IP'$LISTA', iniciando montagem do diretorio..'
echo aqui_senha | sshfs root@$LISTA:/ $SRV_ALVO -o password_stdin
df -kh | grep $SRV_ALVO


====
Resumidamente, preciso listar o primeiro arquivo deste diretorio, dps preciso pegar a primeira linha.. montou.. compactou.. finalizou.. Dps vou para o segundo arquivo dessa lista.. pego a primeira linha.. montou.. compactou.. finalizou.. assim por diante..




6. Re: Compactação de arquivos em uma determinada lista

Enviado em 21/07/2015 - 19:07h

Brother, as informações estão pra lá de confusas...rs Inclusive batizei o script de confuso.sh.
Tentei manter o máximo possível sua lógica. segue o código que acredito fazer o que vc quer.

#!/bin/bash

# Script para montagem, backup e compactação dos servidores remotos.

# confuso.sh

#:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:
#:.: ____ __ :.:
#:.: / ___|___ _ __ / _|_ _ ___ ___ :.:
#:.: | | / _ \| '_ \| |_| | | / __|/ _ \ :.:
#:.: | |__| (_) | | | | _| |_| \__ \ (_) | :.:
#:.: \____\___/|_| |_|_| \__,_|___/\___/ :.:
#:.: :.:
#:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:



SRV_LISTA="/DIRETÓRIO/ONDE/ESTA/OS/ARQUIVOS.TXT " #definir o diretório onde estão os arquivos.txt

clear
echo -e "\n Lendo a lista de servidores... "
sleep 2
echo -e " \n $(ls $SRV_LISTA | wc -l) servidores alvos encontrados."
sleep 1
echo -e "\n Iniciando processo de montagem e compactação...\n"
for lista in $(ls "$SRV_LISTA") # para cada arquivo.txt encontrado no diretório $SRV_LISTA;
do server=$(sed -n '2,$ d' $lista) # Define a variável server com a primeira linha do arquivo.
echo -e 'Iniciando montagem e compactação do server "$server"...'
if ! [ -d /mnt/"$server" ] # se o diretório /mnt/$server não existir, será criado.
then
echoe -e '\n Criando o diretório /mnt/"$server"...'
mkdir /mnt/"$server"
fi
echo "aqui_senha" | sshfs root@"$server":/ /mnt/"$server" -o password_stdin # monta a o $server em /mnt/$server
for dir in `sed -n '2,$ p' $lista` # para cada diretório encontrado dentro do arquivo $lista (linhas 2 e 3);
echo -e 'compactando "$server" : "$dir"...\n'
do tar -zcpvf /mnt/"$server"/root/scripts/BKP-"$dir"-$(date +%d-%m-%Y).tar.gz /mnt/"$server"/"$dir" #compacta e salva....
done
done
echo -e "\n\n Processo concluído com sucesso \n\n"
abs,
---
Eu Acredito, que ás vezes são as pessoas que ninguém espera nada que fazem as coisas que ninguém consegue imaginar.

--- Mestre dos Mestres - Alan Turing ---

7. Re: Compactação de arquivos em uma determinada lista

Enviado em 21/07/2015 - 20:31h

juliano_lc escreveu:

O conteúdo da pasta /lista são arquivos .txt...
Dentro destes arquivos .txt, contém diretórios como:
/mnt/
/tmp/

Esses diretórios são de servidores remotos. O local /mnt/server_alvo é um ponto de montagem no servidor remoto.

O que pretendo fazer é compactar os diretórios mencionados nesses arquivos. Para isso eu estou usando a expressão abaixo:
ARQUIVOS=`sed -n '2,$ p' /tmp/lista/*`
tar -zcpvf /mnt/server_alvo/root/scripts/$LISTA-$DATA.tar.gz /mnt/server_alvo/$ARQUIVOS
Parei aqui porque aqui está o erro.

Se você examinar o conteúdo da variável ARQUIVOS, verá que deve ser mais ou menos o seguinte.

/mnt/ /tmp/ ... 
Se você fizer algo como “echo ABC$ARQUIVOS”, não vai obter “ABC/mnt/ ABC/tmp/ ABC...”, mas sim “ABC/mnt/ /tmp/ ...”.

Se eu quiser colocar o prefixo ABC antes do texto de cada linha, eu teria de fazer essa transformação explicitamente.

echo `echo $ARQUIVOS | sed 's/^/ABC/;s/ / ABC/g'` 
Note que o código acima é meio perigoso porque impede a existência de arquivos com nomes que contenham espaços (mas a sua versão já tinha esse problema).

Por que você não usa a opção -T do tar, que especifica a lista de objetos a arquivar a partir de um arquivo (um objeto por linha), e faz com que cada linha desse arquivo contenha o prefixo desejado? Não precisa nem criar um arquivo, se usar os named pipes do bash.

tar -zcpvf /mnt/server_alvo/root/scripts/$LISTA-$DATA.tar.gz -T <(sed '1d;s,^,/mnt/server_alvo,' /tmp/lista/*) 

8. Re: Compactação de arquivos em uma determinada lista

Enviado em 22/07/2015 - 10:58h

tonyhts escreveu:

Brother, as informações estão pra lá de confusas...rs Inclusive batizei o script de confuso.sh.
Tentei manter o máximo possível sua lógica. segue o código que acredito fazer o que vc quer.

#!/bin/bash

# Script para montagem, backup e compactação dos servidores remotos.

# confuso.sh

#:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:
#:.: ____ __ :.:
#:.: / ___|___ _ __ / _|_ _ ___ ___ :.:
#:.: | | / _ \| '_ \| |_| | | / __|/ _ \ :.:
#:.: | |__| (_) | | | | _| |_| \__ \ (_) | :.:
#:.: \____\___/|_| |_|_| \__,_|___/\___/ :.:
#:.: :.:
#:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:



SRV_LISTA="/DIRETÓRIO/ONDE/ESTA/OS/ARQUIVOS.TXT " #definir o diretório onde estão os arquivos.txt

clear
echo -e "\n Lendo a lista de servidores... "
sleep 2
echo -e " \n $(ls $SRV_LISTA | wc -l) servidores alvos encontrados."
sleep 1
echo -e "\n Iniciando processo de montagem e compactação...\n"
for lista in $(ls "$SRV_LISTA") # para cada arquivo.txt encontrado no diretório $SRV_LISTA;
do server=$(sed -n '2,$ d' $lista) # Define a variável server com a primeira linha do arquivo.
echo -e 'Iniciando montagem e compactação do server "$server"...'
if ! [ -d /mnt/"$server" ] # se o diretório /mnt/$server não existir, será criado.
then
echoe -e '\n Criando o diretório /mnt/"$server"...'
mkdir /mnt/"$server"
fi
echo "aqui_senha" | sshfs root@"$server":/ /mnt/"$server" -o password_stdin # monta a o $server em /mnt/$server
for dir in `sed -n '2,$ p' $lista` # para cada diretório encontrado dentro do arquivo $lista (linhas 2 e 3);
echo -e 'compactando "$server" : "$dir"...\n'
do tar -zcpvf /mnt/"$server"/root/scripts/BKP-"$dir"-$(date +%d-%m-%Y).tar.gz /mnt/"$server"/"$dir" #compacta e salva....
done
done
echo -e "\n\n Processo concluído com sucesso \n\n"



abs,
---
Eu Acredito, que ás vezes são as pessoas que ninguém espera nada que fazem as coisas que ninguém consegue imaginar.

--- Mestre dos Mestres - Alan Turing ---
Uma dúvida.... irá funcionar se eu tiver mais de um arquivo .txt dentro de SRV_LISTA ??

9. Re: Compactação de arquivos em uma determinada lista

Enviado em 22/07/2015 - 11:17h

Sim, a idéia é essa. o loop continua te acabar os arquivos.

obs:: contanto que esses arquivos sejam todos no padrao que vc disse: 1 linha o server e as outras 2 os diretoriis a serem montandos e compactados.


abs
--
Eu Acredito, que ás vezes são as pessoas que ninguém espera nada que fazem as coisas que ninguém consegue imaginar.

--- Mestre dos Mestres - Alan Turing ---

10. Re: Compactação de arquivos em uma determinada lista

Enviado em 22/07/2015 - 11:26h

Fiquei com dúvida nessa parte..
for dir in `sed -n '2,$ p' $lista` # para cada diretório encontrado dentro do arquivo $lista (linhas 2 e 3);
echo -e 'compactando "$server" : "$dir"...\n'
do tar -zcpvf /mnt/"$server"/root/scripts/BKP-"$dir"-$(date +%d-%m-%Y).tar.gz /mnt/"$server"/"$dir" #compacta e salva....
done
O que eu precisaria na verdade, é criar apenas 1 arquivo compactado com todos os diretorios contidos no .txt.. e não compactar diretório por diretório separadamente..

11. Re: Compactação de arquivos em uma determinada lista

Enviado em 22/07/2015 - 12:58h

juliano_lc escreveu:

Fiquei com dúvida nessa parte..
for dir in `sed -n '2,$ p' $lista` # para cada diretório encontrado dentro do arquivo $lista (linhas 2 e 3);
echo -e 'compactando "$server" : "$dir"...\n'
do tar -zcpvf /mnt/"$server"/root/scripts/BKP-"$dir"-$(date +%d-%m-%Y).tar.gz /mnt/"$server"/"$dir" #compacta e salva....
done
O que eu precisaria na verdade, é criar apenas 1 arquivo compactado com todos os diretorios contidos no .txt.. e não compactar diretório por diretório separadamente..

Entendido!

Basta trocar o bloco do for por:

      dir=`sed -n '2,$ p' $lista | paste -s`
echo -e 'compactando "$server" : "$dir"...\n'
tar -zcpvf /mnt/"$server"/root/scripts/BKP-"$server"-$(date +%d-%m-%Y).tar.gz /mnt/"$server"/"$dir" #compacta e salva....
O código completo fica assim:


#!/bin/bash

# Script para montagem, backup e compactação dos servidores remotos.

# confuso.sh

#:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:
#:.: ____ __ :.:
#:.: / ___|___ _ __ / _|_ _ ___ ___ :.:
#:.: | | / _ \| '_ \| |_| | | / __|/ _ \ :.:
#:.: | |__| (_) | | | | _| |_| \__ \ (_) | :.:
#:.: \____\___/|_| |_|_| \__,_|___/\___/ :.:
#:.: :.:
#:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:.:



SRV_LISTA="/DIRETÓRIO/ONDE/ESTA/OS/ARQUIVOS.TXT " #definir o diretório onde estão os arquivos.txt

clear
echo -e "\n Lendo a lista de servidores... "
sleep 2
echo -e " \n $(ls $SRV_LISTA | wc -l) servidores alvos encontrados."
sleep 1
echo -e "\n Iniciando processo de montagem e compactação...\n"
for lista in $(ls "$SRV_LISTA") # para cada arquivo.txt encontrado no diretório $SRV_LISTA;
do server=$(sed -n '2,$ d' $lista) # Define a variável server com a primeira linha do arquivo.
echo -e 'Iniciando montagem e compactação do server "$server"...'
if ! [ -d /mnt/"$server" ] # se o diretório /mnt/$server não existir, será criado.
then
echoe -e '\n Criando o diretório /mnt/"$server"...'
mkdir /mnt/"$server"
fi
echo "aqui_senha" | sshfs root@"$server":/ /mnt/"$server" -o password_stdin # monta a o $server em /mnt/$server
dir=`sed -n '2,$ p' $lista | paste -s`
echo -e 'compactando "$server" : "$dir"...\n'
tar -zcpvf /mnt/"$server"/root/scripts/BKP-"$server"-$(date +%d-%m-%Y).tar.gz /mnt/"$server"/"$dir" #compacta e salva....
done
echo -e "\n\n Processo concluído com sucesso \n\n"
---
Eu Acredito, que ás vezes são as pessoas que ninguém espera nada que fazem as coisas que ninguém consegue imaginar.

--- Mestre dos Mestres - Alan Turing ---

12. Re: Compactação de arquivos em uma determinada lista

Enviado em 22/07/2015 - 13:56h

Essas respostas estão todas com o mesmo problema de não expandir o caminho completo.

Eu já mostrei como fazer, mas ninguém deu ouvidos (ou olhos).
01 02

Responder tópico

Responder tópico

Entre na sua conta para responder.

Fazer login para responder