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


11

我正在尝试创建一个压缩的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

可能?

Answers:


10

这将列出所有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

(这样就省去了空目录)


1
太棒了,谢谢您的帮助。这是我想出的:find docs \( -iname '*.pdf' -o -iname '*.mp3' \) -printf '"%p"\n' | xargs tar czf docs-media.tar.gz
Matt Alexander

3
@mattalexx:请注意,如果任何文件名包含空格或\'"(xargs的错误),此命令将不起作用;如果文件名太多(内核的错误),则该命令将不起作用。
吉尔(Gilles)“所以,别再邪恶了”,

2
@Gilles关于带有空格和单引号的文件名,该-printf '"%p"\n'部分将解决这一问题(至少对我有用)。
马特·亚历山大

1
@Gilles有趣的内核限制。在Linux中的命令中可以有多少个参数?
马特·亚历山大

5
哦,在“将不起作用”上,请注意这里的失败模式是:如果命令行太长,xargs会将其拆分,以便最后的tar调用将静默覆盖以前的调用写入的文件
吉尔(Gilles)“所以,别再邪恶了”,

6

对于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创建档案。

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

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


哦,是的,我的意思是提到zsh的**;我什至没有意识到bash 4现在已经拥有了
Michael Mrozek
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.