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)
(这种方式省略了空目录)
使用 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说将所有其他文件重命名为空名称,这实际上意味着不将它们包含在存档中。