用于备份时,tar
我想创建一个单独的文件列表,该列表包含在存档中,以便与备份 tarball 一起存储。
我还希望能够将 tar 中的错误消息存储在日志中。
不太好的解决方案:
tar --verbose
...&> filelist.txt
但这会在一个文件中给出错误+文件列表。tar --list
创建 tarball 后。但这需要很长时间。
当我第一次滚动球时,有什么方法可以获取文件列表并将其存储在单独的文件中吗?
答案1
你提到你不喜欢,tar --list
因为它很慢。我猜这是因为它是一个很大的 tarball,并且它必须重新扫描整个内容。如果确实如此,您可以通过在创建时进行扫描来获得更好的性能:
tar -c /input/directory | tee output.tar | tar -t > filelist.txt
这用于tee
分割生成的 tarball,一个进入文件,另一个进入tar -t
.
如果你想 gzip 压缩包:
tar -c /input/directory | tee >(gzip > output.tar.gz) | tar -t filelist.txt
我们没有让第一个tar
执行 gzip,因为当第二个 tar 必须再次解压缩时,它会浪费 CPU 周期。相反,我们只在将 tarball 写入磁盘时对其进行 gzip。
答案2
您可以将每个文件附加到 tar 文件中:
for f in file ...; do
echo "$f"
tar rf result.tar $f
done
答案3
这会将错误消息 ( stderr
) 放入一个文件中,将文件列表 ( stdout
) 放入一个文件中:
$ 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
--index-file
按照约翰在我的问题的评论中建议的方式使用也会很好:
tar --create \
--verbose \
--index-file=$fileList \
--file $archiveFile \
$filesystemToArchive \
&>> $logFilename
来自 tar 联机帮助页:
--索引文件=文件
将详细输出发送到 FILE