bash .tar criação

0

Eu tento criar um .tar.gz com arquivos ou diretórios em parâmetros para fazer um backup.

No entanto, quando eu crio o arquivo .tar.gz, eu tenho esse erro:

tar: path_directory_1: cannot stat: No such file or directory
tar: path_directory_2 : cannot stat: No such file or directory
tar: Stopped with failed status due to previous errors 

Como construí o arquivo:

tar zcvf $dirbackup/backup-$backupDate.tar.gz $string

em que string é:

old_IFS=$IFS

IFS=$'\n'

string="";

for line in $(cat $1); do

      string="$string $line"

done

IFS=$old_IFS

$1 : arquivo com o diretório de caminhos e o arquivo de caminhos para salvar.

Exemplo de $1 content (apenas caminhos de diretórios para salvar):

~/Documents/MIAGE/L3/semestre5/web
~/Documents/MIAGE/L3/semestre5/communication/

Resultado com set -x:

+ tar zcvf /var/backups/mesbackups/backup-09-11-2016-13-58/backup-09-11‌​-2016-13-58.tar.gz '~/Documents/MIAGE/L3/semestre5/web' '~/Documents/MIAGE/L3/semestre5/communication/'
tar: ~/Documents/MIAGE/L3/semestre5/web : cannot stat : No such file or directory 
tar: ~/Documents/MIAGE/L3/semestre5/communication : cannot stat : No such file or directory 
tar: Stopped with failed status due to previous errors 

Quando executo este comando no shell, isso funciona ...

tar zcvf /var/backups/mesbackups/test/backup-09-11‌​-2016-13-58.tar.gz ~/Documents/MIAGE/L3/semestre5/web ~/Documents/MIAGE/L3/semestre5/communication/ 

Como posso fazer com o meu script? Isso parece funcionar sem quots não?

    
por Nicolas Lamblin 09.11.2016 / 11:21

2 respostas

0

Análise

Olhando os exemplos de arquivos de entrada

~/Documents/MIAGE/L3/semestre5/web
~/Documents/MIAGE/L3/semestre5/communication/

e as mensagens de erro de tar

tar: ~/Documents/MIAGE/L3/semestre5/web : cannot stat : No such file or directory
tar: ~/Documents/MIAGE/L3/semestre5/communication : cannot stat : No such file or directory

você parece presumir que o interpretador de shell ou tar expandirá o til ( ~ ) ao ler suas linhas com uma das seguintes construções:

  • for i in $(cat infile)
  • while read i; do ...; done < infile
  • mapfile ... < infile

Esta presunção é falsa. Nenhum dos intérpretes de shell comuns executa expansão , ou mais especificamente expansão do til nessas situações. Ele avalia apenas seqüências de escape (consulte read ). Nenhuma implementação conhecida (para mim) de tar executa expansão de argumento (e não deveria, já que isso criaria muitos problemas).

Solução

Você precisa expandir os caracteres do til em seus arquivos de entrada de alguma forma.

A maneira mais fácil é provavelmente alterar o arquivo de entrada manualmente ou com um filtro (se você puder ter certeza de que $HOME não inclui caracteres de escape ou delimitadores de sed (aqui \ e ; )):

sed -e 's;^~\(\/\|$\);'"$HOME"';' infile | tar cvzf my-archive.tar.gz --from-file -

Se você quiser tirar proveito de todas as expansões de shell disponíveis e puder assegurar que a entrada adequada escape , você pode usar o eval comando interno :

while read -r i; do
  eval echo "$i"
done < infile |
tar cvzf my-archive.tar.gz --from-file -
    
por David Foerster 09.11.2016 / 22:43
1

Se $1 for o nome de um arquivo contendo uma lista de arquivos a serem adicionados ao arquivo, um por linha, você deverá usar apenas o formulário --files-from FILE de tar

tar zcvf "$dirbackup"/backup-"$backupDate".tar.gz --files-from "$1"

Se você não pode usar --files-from por algum motivo, então a próxima melhor opção é provavelmente usar uma matriz bash

mapfile -t files < "$1"

tar zcvf "$dirbackup"/backup-"$backupDate".tar.gz "${files[@]}"

embora isso possa ter problemas se o número de arquivos em $1 for muito grande.

    
por steeldriver 09.11.2016 / 12:39