web-dev-qa-db-ja.com

tarballを作成するときに別のファイルリストを生成することは可能ですか?

バックアップにtarを使用する場合、バックアップtarballと一緒に保存するために、アーカイブに含まれるファイルの別のリストを作成したいと思います。

また、tarからのエラーメッセージをログに保存できるようにしたいです。

あまり良くない解決策:

  • tar --verbose ... &> filelist.txtしかし、これは1つのファイルにエラー+ファイルリストを与えます。
  • tar --listtarballが作成された後。しかし、これには長い時間がかかります。

初めてボールを転がすと同時に、ファイルリストを取得して別のファイルに保存する方法はありますか?

2
PetaspeedBeaver

これにより、エラーメッセージ(stderr)が1つのファイルに、ファイルリスト(stdout)が1つのファイルに配置されます。

$ 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

Johanが私の質問へのコメントで提案したように--index-fileを使用することも、うまく機能します。

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

Tarのマンページから:

--index-file = FILE

詳細な出力をFILEに送信する

0
PetaspeedBeaver

tar --listは遅いので、気に入らないとおっしゃっています。これは大きなtarballであり、全体を再スキャンする必要があるためだと思います。これが実際に当てはまる場合は、作成時にスキャンすることで、パフォーマンスを向上させることができます。

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

これは、teeを使用して、結果のtarballを分割します。1つはファイルに移動し、もう1つはtar -tに移動します。

Tarballをgzipで圧縮したい場合:

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

最初のtarでgzipを実行する必要はありません。これは、2番目のtarで再度解凍する必要があるときにCPUサイクルを浪費するためです。代わりに、tarballがディスクに書き込まれているときにgzipで圧縮するだけです。

2
Patrick

各ファイルをtarファイルに追加できます。

for f in file ...; do 
    echo "$f"
    tar rf result.tar $f
done
1
glenn jackman