我正在尝试创建一个压缩 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
表示将所有其他文件重命名为空名称,这实际上意味着不将它们包含在存档中。