Contents

查找tar文件

1. 概述

在这个简短的教程中,我们将检查一些可用的命令组合,以找到一组文件并将它们压缩成一个 tarball。 为此,我们将研究:

  • find ,它允许使用不同的过滤器和选项查找文件
  • tar ,将给定的输入文件压缩成一个存档

事不宜迟,让我们来看看我们的选择。

2. 解决方案

为了避免混淆,我们的示例将围绕一个非常基本的用例展开,在该用例中,我们希望对当前目录中的所有文件进行tar

2.1.使用命令替换

首先,让我们考虑最简单的解决方案,它使用命令替换 来执行我们的find并将其输出提供给tar

$ tar -czf archive.tar.gz `find . -type f`

尽管这是一种非常简单的方法,但此命令不处理名称中带有空格的文件。假设我们的find命令在其输出中返回一个名为“ hello world.txt ”的文件。由于find不会在文件名周围添加引号或在其输出中的文件名中转义空白字符,因此tar命令会将其视为两个文件参数:helloworld.txt。因此,它不会将该文件添加到我们的存档中。

2.2. 使用xargs

另一个简单的选择是使用xargsfind输出转换为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 {} \;