Compactação de arquivos em uma determinada lista

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

Juliano Cunha
juliano_lc

(usa CentOS)

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?


  


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

Wellingthon Dias Queiroz - @tonyhts
tonyhts

(usa Arch Linux)

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

Juliano Cunha
juliano_lc

(usa CentOS)

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

Wellingthon Dias Queiroz - @tonyhts
tonyhts

(usa Arch Linux)

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

Juliano Cunha
juliano_lc

(usa CentOS)

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

Wellingthon Dias Queiroz - @tonyhts
tonyhts

(usa Arch Linux)

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

Paulo
paulo1205

(usa Ubuntu)

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

Juliano Cunha
juliano_lc

(usa CentOS)

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

Wellingthon Dias Queiroz - @tonyhts
tonyhts

(usa Arch Linux)

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

Juliano Cunha
juliano_lc

(usa CentOS)

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

Wellingthon Dias Queiroz - @tonyhts
tonyhts

(usa Arch Linux)

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

Paulo
paulo1205

(usa Ubuntu)

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



Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts