Tar 压缩目录中的所有 PDF,保留目录结构

Tar 压缩目录中的所有 PDF,保留目录结构

我正在尝试创建一个压缩 tarball,其中包含我的目录之一中存在的所有 PDF 文件。需要保留目录结构。不需要空目录,但我真的不在乎它们是否在那里。

例如,假设我有一个如下所示的目录:

dir
dir/subdir1
dir/subdir1/subsubdir1/song.mp3
dir/subdir2
dir/subdir2/subsubdir1
dir/subdir2/subsubdir1/document.pdf
dir/subdir2/subsubdir1/another-song.mp3
dir/subdir2/subsubdir1/top-ten-movies.txt
dir/subdir3
dir/subdir3/another-document.pdf

运行命令后,我想包含dir.tar.gz以下内容:

dir
dir/subdir2
dir/subdir2/subsubdir1
dir/subdir2/subsubdir1/document.pdf
dir/subdir3
dir/subdir3/another-document.pdf

可能的?

答案1

这将列出所有 PDF:

$ find dir/ -name '*.pdf'
./dir/subdir2/subsubdir1/document.pdf
./dir/subdir3/another-document.pdf

您可以通过管道将xargs其作为单个空格分隔的行获取,并将其提供给tar创建存档:

$ find dir/ -name '*.pdf' | xargs tar czf dir.tar.gz

(这种方式省略了空目录)

答案2

使用 bash ≥4 或 zsh 和 GNU tar:

tar -czf dir.tar.gz dir/**/*.pdf

如果您有大量 PDF 文件并且命令行太长,这可能不起作用。那么你需要一个更复杂的基于查找的解决方案(同样,使用 GNU tar):

tar -cf dir.tar -T /dev/null
find dir -name '*.pdf' -exec tar -rf dir.tar {} +
gzip dir.tar

或者(并且可移植)您可以使用以下命令创建存档帕克斯

pax -w -x ustar -s '/\.pdf$/&/' -s '/.*//' . | gzip >dir.tar.gz

第一个-s表示包含所有.pdf文件,而不更改其名称。第二个-s表示将所有其他文件重命名为空名称,这实际上意味着不将它们包含在存档中。

相关内容