É possível gerar uma lista de arquivos separada ao criar um tarball?

2

Ao usar tar para backups, gostaria de criar uma lista separada dos arquivos incluídos no arquivo para armazenar junto com o tarball de backup.

Eu também quero poder armazenar as mensagens de erro do tar em um log.

Soluções que não são tão boas:

  • tar --verbose ... &> filelist.txt Mas isso daria erros + lista de arquivos em um arquivo.
  • tar --list após o tarball ter sido criado. Mas isso leva muito tempo.

Existe alguma maneira de obter a lista de arquivos e armazená-la em um arquivo separado ao mesmo tempo em que estou rolando a bola pela primeira vez?

    
por PetaspeedBeaver 15.04.2014 / 11:20

3 respostas

0

Isso colocaria as mensagens de erro ( stderr ) em um arquivo e lista de arquivos ( stdout ) em um arquivo:

$ tar -cvf archive.tar test nonexisting 1> stdout.txt 2> stderr.txt

$ cat stdout.txt
test/
test/05.txt
test/06.txt
test/00.txt
test/01.txt
test/10.txt
test/07.txt
test/03.txt
test/02.txt
test/04.txt
test/08.txt
test/09.txt

$ cat stderr.txt
tar: nonexisting: Funktion "stat" misslyckades: Filen eller katalogen finns inte
tar: Avslutar med felstatus på grund av tidigare fel

Usar --index-file como sugerido por Johan no comentário à minha pergunta também funcionaria bem:

tar --create \
    --verbose \
    --index-file=$fileList \
    --file $archiveFile \
    $filesystemToArchive \
    &>> $logFilename

De manpages de tar:

--index-file=FILE

send verbose output to FILE

    
por 24.04.2014 / 13:26
2

Você mencionou que não gosta de tar --list porque é lento. Eu estou supondo que isso é porque é um grande tarball, e tem que escanear novamente a coisa toda. Se este é realmente o caso, você pode obter um melhor desempenho disso digitalizando conforme está sendo criado:

tar -c /input/directory | tee output.tar | tar -t > filelist.txt

Isso usa tee para dividir o tarball resultante, um indo para um arquivo, o outro indo para tar -t .

Se você quiser compactar o tarball:

tar -c /input/directory | tee >(gzip > output.tar.gz) | tar -t filelist.txt

Não temos o primeiro tar do gzip, pois ele desperdiçará ciclos de CPU quando o segundo tar tiver que descompactá-lo novamente. Em vez disso, apenas compactamos o tarball enquanto ele está sendo gravado no disco.

    
por 15.04.2014 / 14:57
1

Você pode anexar cada arquivo ao arquivo tar:

for f in file ...; do 
    echo "$f"
    tar rf result.tar $f
done
    
por 15.04.2014 / 11:32