创建 tarball 时是否可以生成单独的文件列表?

创建 tarball 时是否可以生成单独的文件列表?

用于备份时,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

相关内容