バックアップにtar
を使用する場合、バックアップtarballと一緒に保存するために、アーカイブに含まれるファイルの別のリストを作成したいと思います。
また、tarからのエラーメッセージをログに保存できるようにしたいです。
あまり良くない解決策:
tar --verbose
... &> filelist.txt
しかし、これは1つのファイルにエラー+ファイルリストを与えます。tar --list
tarballが作成された後。しかし、これには長い時間がかかります。初めてボールを転がすと同時に、ファイルリストを取得して別のファイルに保存する方法はありますか?
これにより、エラーメッセージ(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に送信する
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で圧縮するだけです。
各ファイルをtarファイルに追加できます。
for f in file ...; do
echo "$f"
tar rf result.tar $f
done