返回

如何递归 tar 指定类型的文件?

Linux

递归 tar 指定文件类型

问题

如何递归地 tar 指定类型的文件?仅仅使用 tar 命令只能 tar 所有文件,而使用 tar *.php *.html 则会忽略子目录。

解决方法

可以使用 find 命令和 tar 命令结合来递归地 tar 指定类型的文件。

find 命令可以搜索目录树,并根据指定的条件查找文件。以下命令将查找当前目录及其所有子目录中的所有 .php.html 文件:

find . -type f \( -name '*.php' -o -name '*.html' \) -print0

该命令的输出将包含以空字符分隔的文件路径列表。

然后,可以使用 tar 命令将这些文件 tar 到存档中:

tar -cf my_archive.tar --null -T -

--null 选项告诉 tar 命令期望使用空字符作为文件列表的分隔符,而 -T - 选项告诉 tar 命令从标准输入读取文件列表。

将这两个命令结合起来,我们得到:

find . -type f \( -name '*.php' -o -name '*.html' \) -print0 | tar -cf my_archive.tar --null -T -

示例

假设有一个目录结构如下:

/my_directory
    /subdir1
        file1.php
        file2.html
    /subdir2
        file3.php
        file4.html

要 tar subdir1subdir2 中的所有 .php.html 文件,请运行以下命令:

find /my_directory -type f \( -name '*.php' -o -name '*.html' \) -print0 | tar -cf my_archive.tar --null -T -

该命令将创建 my_archive.tar,其中包含以下文件:

/my_directory/subdir1/file1.php
/my_directory/subdir1/file2.html
/my_directory/subdir2/file3.php
/my_directory/subdir2/file4.html

常见问题解答

  • Q:我可以使用其他命令来查找文件吗?

    • A:是的,你可以使用其他命令,如 locategrep。然而,find 命令是最灵活和强大的命令,因为它允许你指定更复杂的搜索条件。
  • Q:我可以使用通配符来匹配文件名吗?

    • A:是的,你可以使用通配符,如 *?[]。但是,请注意,通配符可能会导致性能问题,因此最好避免使用通配符。
  • Q:我可以使用正则表达式来匹配文件名吗?

    • A:是的,你可以使用 -regex 选项来使用正则表达式匹配文件名。这比使用通配符更灵活,但性能也更低。
  • Q:我可以使用 tar 命令排除某些文件吗?

    • A:是的,你可以使用 --exclude 选项来排除某些文件。例如,要排除所有 .txt 文件,请使用以下命令:
find . -type f \( -name '*.php' -o -name '*.html' \) -print0 | tar -cf my_archive.tar --null -T - --exclude='*.txt'
  • Q:我可以使用 tar 命令压缩存档吗?
    • A:是的,你可以使用 -z 选项来压缩存档。例如,要使用 gzip 压缩存档,请使用以下命令:
find . -type f \( -name '*.php' -o -name '*.html' \) -print0 | tar -cfz my_archive.tar.gz --null -T -