查找tar文件
1. 概述
在这个简短的教程中,我们将检查一些可用的命令组合,以找到一组文件并将它们压缩成一个 tarball。 为此,我们将研究:
事不宜迟,让我们来看看我们的选择。
2. 解决方案
为了避免混淆,我们的示例将围绕一个非常基本的用例展开,在该用例中,我们希望对当前目录中的所有文件进行tar 。
2.1.使用命令替换
首先,让我们考虑最简单的解决方案,它使用命令替换 来执行我们的find并将其输出提供给tar:
$ tar -czf archive.tar.gz `find . -type f`
尽管这是一种非常简单的方法,但此命令不处理名称中带有空格的文件。假设我们的find命令在其输出中返回一个名为“ hello world.txt ”的文件。由于find不会在文件名周围添加引号或在其输出中的文件名中转义空白字符,因此tar命令会将其视为两个文件参数:hello和world.txt。因此,它不会将该文件添加到我们的存档中。
2.2. 使用xargs
另一个简单的选择是使用xargs 将find输出转换为tar参数:
$ find . -type f | xargs tar -czf archive.tar.gz
不幸的是,这与前一个具有相同的缺点,因为空格是xargs用于拆分 arguments的默认分隔符。但是,这次我们可以通过使用*-d*选项将分隔符更改为另一个字符来轻松修复它:
$ find . -type f | xargs -d "\n" tar -czf archive.tar.gz
2.3. 使用find -print0
尽管我们的最后一个示例有效,但通常更好的做法是使用空字符分隔符来避免意外结果。**这可以使用find -print0轻松实现,它将默认分隔符替换为null。**我们还将使用tar –null来分割带有这个字符而不是换行符的文件:
$ find . -type f -print0 | tar -czf archive.tar.gz --null -T -
不过要记住的一件事是***-print0*仅适用于最后一个条件,因此,如果我们有多个条件,我们需要用括号将它们包装起来**:
$ find . \( -type f -o -name '*.c' \) -print0 | tar -czf archive.tar.gz --null -T -
请注意,这里我们使用tar -T – 来压缩stdin中列出的文件,而不是xargs等价文件。
2.4. 使用文件
我们要考虑的下一个方法涉及使用中间文件来存储find输出,然后使用相同的文件作为*tar *的输入。如果我们想跟踪我们为日志或进一步处理而压缩的文件,这个解决方案就派上用场了:
$ find . -type f > archiveFileList && tar -czf archive.tar.gz -T archiveFileList
2.5. 使用find -exec
最后,让我们考虑一个稍微不同的场景,我们要创建多个存档,每个找到的文件一个。为了做到这一点,我们可以使用find -exec,它将为每个匹配的文件运行一个给定的命令。此外,我们可以通过用一对花括号引用当前文件名来使用它:
$ find . -type f -exec tar -czf {}.tar.gz {} \;