【问题标题】:How to tar certain file types in all subdirectories?如何在所有子目录中压缩某些文件类型?
【发布时间】:2013-09-14 21:53:03
【问题描述】:

我想对一个目录及其子目录中的所有 .php 和 .html 文件进行 tar 处理。如果我使用

tar -cf my_archive *

它会压缩所有我不想要的文件。如果我使用

tar -cf my_archive *.php *.html

它忽略子目录。我怎样才能使它递归地 tar 但只包含两种类型的文件?

【问题讨论】:

    标签: linux tar


    【解决方案1】:

    find ./someDir -name "*.php" -o -name "*.html" | tar -cf my_archive -T -

    【讨论】:

    • @DeeDee 文件数量等有限制吗?
    • @DeeDee - 不,我的意思是你不需要括号!
    • @user1566515 可能存在一些文件系统限制或总体空间限制,这会对您的 tar 文件设置上限。这完全取决于您自己的系统。否则,管道实际上会即时创建 tar 文件,因此您不会受到文件数量或大小的限制。
    • 谢谢! ...如何添加2个以上的条件/文件类型?
    • @gluuke 对每个新条件使用 -o -name [pattern]
    【解决方案2】:

    一种方法是:

    tar -cf my_archive.tar $( find -name "*.php" -or -name "*.html" )
    

    不过,这种方法有一些注意事项:

    1. 如果文件或目录中有空格,则会失败,并且
    2. 如果文件太多以至于最大命令行长度已满,它将失败。

    解决这些问题的方法是将 find 命令的内容输出到文件中,然后使用“-T, --files-from FILE”选项进行 tar。

    【讨论】:

    • 1) “失败”是指跳过带有空格的文件还是不创建 tar 存档? 2)我有大约 10 万个文件。是否超过了最大命令行长度?
    • 1.它将创建存档,但会报告丢失的文件。 2. 那会太长了,我想。鉴于此,您最好使用下面@DeeDee 建议的方法,它会很好地解决这些问题。
    【解决方案3】:
    tar -cf my_archive `find ./ | grep '.php\|.html'`
    

    使用“find”和“grep”获取所有目录及其子目录中.php和.html文件的所有路径。 然后将这些路径信息传递给 tar 进行压缩。

    请小心那些符号 ` 和 '。另请注意,这将达到您的 shell 在命令行上允许的字符数的限制,这与其他一些答案不同。

    【讨论】:

      【解决方案4】:

      这将处理带有空格的路径:

      find ./ -type f -name "*.php" -o -name "*.html" -exec tar uvf myarchives.tar {} +
      

      【讨论】:

        【解决方案5】:

        如果您使用的是 bash 版本 > 4.0,则可以利用 shopt -s globstar 来完成以下工作:

        shopt -s globstar; tar -czvf deploy.tar.gz **/Alice*.yml **/Bob*.json
        

        这将从任何子目录添加以 Alice 开头的所有 .yml 文件,并从任何子目录添加以 Bob 开头的所有 .json 文件。

        【讨论】:

        • 唯一只使用 tar 的答案,IMO 的最佳答案。
        • 尽管 glob '**' 对目录的印象,但此命令不会递归执行(任何子子文件夹)
        • @Eddie ** 应该可以工作。您的参数可能有所不同。还要检查您在命令行中传递的文件夹名称中是否有空格。如果没有,您可以粘贴您的实际命令吗?
        • '**' 在到达命令之前由 shell 评估,它只被视为 2 个独立的 * 解析为 0 或字符,它没有递归功能来跨越目录tldp.org/LDP/GNU-Linux-Tools-Summary/html/x11655.htm
        • @eddie 是的,它是由 shell 评估的,虽然 bash > 4.0 有一个 shopt -s globstar 选项,所以答案是正确的,实际上是最好的一个
        【解决方案6】:

        将它们放在一个文件中

        find . \( -name "*.php" -o -name "*.html" \) -print > files.txt
        

        然后使用该文件作为 tar 的输入,根据您使用的 tar 版本使用 -I 或 -T

        使用 h 复制符号链接

        tar cfh my.tar -I files.txt 
        

        【讨论】:

          【解决方案7】:

          find ./ -type f -name "*.php" -o -name "*.html" -printf '%P\n' |xargs tar -I 'pigz -9' -cf target.tgz

          多核或单核:

          find ./ -type f -name "*.php" -o -name "*.html" -printf '%P\n' |xargs tar -czf target.tgz

          【讨论】:

            【解决方案8】:

            使用 zsh 很容易:

            tar cvzf foo.tar.gz **/*.(php|html)
            

            【讨论】:

            • 你的意思是-czvf
            • - 是可选的 tar
            猜你喜欢
            • 1970-01-01
            • 2012-05-13
            • 2020-08-22
            • 2017-05-28
            • 2012-09-02
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多