tar - 提取的文件列表

tar - 提取的文件列表

我怎样才能从a中提取文件.tar.gz归档同时保留提取的文件的踪迹?

例如,假设我有以下文件结构......

ROOT
 ╠═▶ children
 ║    ╠═▶ joe.txt
 ║    ╚═▶ george.txt
 ╠═▶ bar.txt
 ╠═▶ foo.txt
 ╚═▶ A̲R̲C̲H̲I̲V̲E̲.t̲a̲r̲.b̲z̲
      ├─▷ children
      │    ├─▷ joe.txt
      │    └─▷ bob.txt
      ├─▷ hello.txt
      ├─▷ world.txt
      └─▷ foo.txt

现在,如果我从存档中提取文件,同时保留较新的文件,我想知道哪些文件已被提取,以便我可以执行以下操作:
tar xf ./ARCHIVE.tar.gz --keep-newer-files | xargs -I EXTRACTED_FILE echo EXTRACTED_FILE

答案1

我将使用该选项--to-command来触发打印所有提取的文件

参数是一个命令,它将使用环境变量 TAR_FILENAME 来获取文件名,并将在STDIN

所以你必须读取STDIN 并创建提取的文件,你可以在STDOUT你创建的文件上打印

tar -xzf ../ARCH.tgz --keep-newer-files \
   --to-command="sh -c $(printf '%q' \
  'mkdir -p "$(dirname "$TAR_FILENAME")";dd of="$TAR_FILENAME" >/dev/null 2>&1;echo "#EXTRACTED#$TAR_FILENAME" ')" > output_tar.txt

每个提取的文件都会output_tar.txt有一行。

写入外部程序更多细节

答案2

根据我的要求,我有时需要列出与存档内容匹配的所有可用的提取文件(无论是否较新)。

在这种情况下,一旦执行(或不执行)tar 提取,我可以列出有效提取的文件。

我这样做:

tar -xzf ./ARCH.tgz --keep-newer-files
for file in $(tar -tf ./ARCH.tgz 2>/dev/null)
do
  if [[ -e $file && ! -d $file ]]
  then
    echo $file
  fi
done > output_tar.txt

使用 xargs 的一个可能不太明确但简洁的解决方案是:

tar -tf ./ARCH.tar 2>/dev/null | xargs -L1 bash -c 'if [[ -e $0 && ! -d $0 ]]; then echo $0; fi;'

相关内容