【问题标题】:Use grep -lr output to add files to tar使用 grep -lr 输出将文件添加到 tar
【发布时间】:2012-12-09 23:17:24
【问题描述】:

在 UBUNTU 和 CENTOS 中。

我有一些文件要根据它们的内容进行 tar。

$ grep -rl "123.45" .

以这种格式返回大约 10 个文件的列表:

./somefolder/someotherfolder/somefile.txt
./anotherfolder/anotherfile.txt

等等……

我想把它们全部 tar.gz。

我试过了:

$ grep -rl "123.45" . | tar -czf files.tar.gz

不起作用。这就是我在这里的原因。有任何想法吗?谢谢。

刚刚尝试过,它在 Ubuntu 中运行,但在 CentOS 中我得到“tar: 02: Cannot stat: No such file or directory”。

$ tar -czf test.tar.gz `grep -rl "123.45" .`

如果其他人有更好的方法,请告诉我。至少,上面的那个在 Ubuntu 中效果很好。

【问题讨论】:

    标签: linux ubuntu grep centos tar


    【解决方案1】:

    像这样:

     ... | tar -T - -czf files.tar.gz
    

    "-T -" 导致 tar 从标准输入读取文件名。第二个减号代表标准输入。 ——

    【讨论】:

    • 你能解释一下吗?它有效,但需要更多信息才能赢得投票
    • @AlexandreReisRibeiro:“-T -”导致 tar 从标准输入读取文件名。第二个减号代表标准输入。
    【解决方案2】:
    grep -rl "123.45" . | xargs tar -czf files.tar.gz
    

    【讨论】:

    • 如果你碰巧有足够的文件匹配 grep,xargs 将调用 tar 两次,第二次将覆盖第一次创建的文件。
    • 我试过这个并在 CentOS 上得到“无法统计:没有这样的文件或目录”。
    【解决方案3】:

    Tar 希望被告知要处理哪些文件,而不是通过标准输入给出文件的名称。

    但它确实有一个 -T / --files-from 选项。所以我建议使用它。将所选文件列表输出到临时文件,然后 tar 读取该文件,如下所示:

    T=$(mktemp)
    grep -rl "123.45" . > $T
    tar cfz files.tar.gz -T $T
    rm -f $T
    

    如果你愿意,你也可以像这样使用shell扩展:

    tar cfz files.tar.gz -- $(grep -rl "123.45" .)
    

    但是如果你有太多文件或者任何文件有奇怪的名字(比如空格等),那将会失败。

    【讨论】:

    • 我添加到问题底部的解决方案怎么样?
    • @ButtleButkus - 反引号字符与$() 语法基本相同,它们都是命令扩展的形式。有一些小的差异,我个人更喜欢$(),但您的解决方案适用于大多数情况。正如我上面提到的,如果匹配的文件太多或者这些文件中的任何一个文件名中有空格,它将失败。
    • 奇怪。 “我的”解决方案适用于 Ubuntu。但是我在 CentOS 中遇到错误。我从你的建议中得到了同样的错误。我试过tar -czf files.tar.gz -- $(grep -rl "123.45" .) - 注意我添加了点。但是,同样的错误。 “无法统计:没有这样的文件或目录”。
    • @ButtleButkus,你是正确的缺少“。”是一个错误。我已经修好了。您遇到的错误可能是几件事:当前目录可能无效,可能您在匹配文件中有空格或其他特殊字符,或者文件在 grep 找到它们和 tar 尝试读取之间被删除他们。手动运行 grep 应该有助于解决这个问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-11
    • 1970-01-01
    • 2012-06-04
    • 2013-04-11
    • 1970-01-01
    相关资源
    最近更新 更多