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

Mat*_*der 11 tar find recursive

我正在尝试创建一个压缩的 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
Run Code Online (Sandbox Code Playgroud)

运行命令后,我想dir.tar.gz包含这个:

dir
dir/subdir2
dir/subdir2/subsubdir1
dir/subdir2/subsubdir1/document.pdf
dir/subdir3
dir/subdir3/another-document.pdf
Run Code Online (Sandbox Code Playgroud)

可能的?

Mic*_*zek 10

这将列出所有 PDF:

$ find dir/ -name '*.pdf'
./dir/subdir2/subsubdir1/document.pdf
./dir/subdir3/another-document.pdf
Run Code Online (Sandbox Code Playgroud)

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

$ find dir/ -name '*.pdf' | xargs tar czf dir.tar.gz
Run Code Online (Sandbox Code Playgroud)

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

  • 哦,关于“不会工作”,注意这里的失败模式是,如果命令行太长,xargs 会把它拆分,这样**最后一次 tar 调用会默默覆盖以前调用写入的文件** . (5认同)
  • @mattalexx:请注意,如果任何文件名包含空格或`\'"`(xargs 的错误),则此命令将不起作用,如果文件名过多(内核的错误),则该命令将不起作用。 (3认同)
  • @Gilles 关于带有空格和单引号的文件名,`-printf '"%p"\n'` 部分会处理这个问题(至少对我来说是这样)。 (2认同)

Gil*_*il' 6

使用 bash ?4 或 zsh 和 GNU tar:

tar -czf dir.tar.gz dir/**/*.pdf
Run Code Online (Sandbox Code Playgroud)

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

tar -cf dir.tar -T /dev/null
find dir -name '*.pdf' -exec tar -rf dir.tar {} +
gzip dir.tar
Run Code Online (Sandbox Code Playgroud)

或者(并且可移植)您可以使用pax创建存档。

pax -w -x ustar -s '/\.pdf$/&/' -s '/.*//' . | gzip >dir.tar.gz
Run Code Online (Sandbox Code Playgroud)

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