Contents

归档某些类型的文件

1. 概述

使用tar 命令,我们可以将多个文件打包成一个存档,也称为“tarball”。有时,我们想归档某些类型的文件。

在本快速教程中,我们将介绍如何实现它。

2. 例子

为了方便演示和解释,首先我们创建一个例子:

$ tree app
app
├── app.config
├── data
│   ├── app.data
│   ├── orders.cache
│   └── orders.csv
├── log
│   ├── app.log
│   └── login.log
└── program
    └── Application.class
3 directories, 7 files

如上面的输出所示,我们有一个名为“ app ”的应用程序目录,其中包含一些子目录和文件。

现在,假设我们需要归档所有日志文件 ( *.log ) 和数据文件 ( *.csv和*.data ),但要排除 tarball 中的缓存文件。

我们可以采取“分而治之”的方法来解决这个问题:

  • 找到我们需要的文件
  • 归档我们找到的文件

接下来,让我们看看他们的行动。

3. 使用 find命令查找需要的文件

第一步是找到我们需要的文件。

因此,这里我们需要在 app目录下查找文件扩展名为**.log*、*.csv或**.data的文件。*这是find 命令擅长的工作:

$ find app -name *.data -o -name *.csv -o -name *.log
app/data/orders.csv
app/data/app.data
app/log/login.log
app/log/app.log

在上面的find命令中,我们使用了-o 运算符(逻辑OR)来连接三个*-name*表达式**以获取所需的文件。

或者,我们也可以通过 Regex 找到文件:

$ find app -type f -a -regex '.*[.]\(data\|csv\|log\)$'
app/data/orders.csv
app/data/app.data
app/log/login.log
app/log/app.log

这一次,我们使用了*-a* 运算符(逻辑AND)来连接 Regex 和 ’ -type f ’ 表达式。

值得一提的是find使用findutils-default作为默认的 Regex 类型。我们可以使用*-regextype*选项分配不同的正则表达式类型。

例如,我们可以使用egrep 类型来保存一些转义,以使代码更易于阅读:

find app -regextype egrep -type f -a -regex '.*[.](/data|csv|log)$'

如果我们执行命令“ find -regextype help ”,find将列出所有支持的正则表达式类型。

4. 归档找到的文件

到目前为止,我们已经找到了我们需要的所有文件。现在,让我们创建存档。换句话说,我们需要以某种方式将find命令的结果传递给tar命令。

我们中的许多人可能会想出命令替换 方法来使find和 tar一起工作:

$ tar -cf app-data.tar $( find app -name *.data -o -name *.csv -o -name *.log )

之后,我们可以查看创建的app-data.tar文件的内容。我们看到这种方法适用于我们的示例问题:

$ tar -tf app-data.tar
app/data/orders.csv
app/data/app.data
app/log/login.log
app/log/app.log

该命令非常简单。但是,如果find的输出包含大量文件,它可能会失败,并且我们会得到“参数列表太长 ”的错误消息。

接下来,让我们看一个更健壮的方法来解决这个问题:

$ find app -name *.data -o -name *.csv -o -name *.log | tar -cf app.tar -T -

让我们快速通过上面的命令。查找部分对 我们来说并不新鲜。让我们看一下tar命令部分。

-T FILE选项提供一个包含文件列表的 FILE,并告诉tar命令归档此列表中的文件。在上面的命令中,我们使用了“ -T – ”。-T后面的“ - ”表示标准输入(stdin)。

find通过管道将文件列表传递给tar命令。因此,tar标准输入由find的输出提供。因此,tar将归档找到的所有已通过管道输入的文件。

最后,让我们检查一下 tarball 是否包含我们预期的文件:

$ tar -tf app.tar
app/data/orders.csv
app/data/app.data
app/log/login.log
app/log/app.log