我怎样才能从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;'