如何使用 'find' 和 -exec 'tar' 从系统上的每个 tar 存档中 grep 出来?

如何使用 'find' 和 -exec 'tar' 从系统上的每个 tar 存档中 grep 出来?

我正在尝试的命令(因为我正在尝试查找以“butterflyinmotion.com”作为目录的 tars)是:

find / -name "*.tar.gz" -exec tar -tzf {} \; | grep -W butterflyinmotion

这显示了很多错误并且不起作用。 grep -W 是必要的,这样我就知道butterflyinmotion.com 备份在哪个文件中。谢谢!

答案1

我认为制作一个小脚本并使用find -exec.

例如:

#!/bin/sh
回声>>> $1”
tar tvf“$1”

使用 -exec ./script.sh "{}" \; 调用它并将结果重定向到文件,然后 grep 该文件egrep '>>>|WhatYouLookFor' file

您还可以在脚本中使用 grep :

#!/bin/sh
回声>>> $1”
tar tvf“$1”| grep '你寻找什么'

或者更灵活:

#!/bin/sh
回声>>> $2”
tar tvf“$2”|查找“$1”

使用 -exec ./script.sh 'WhatYouLookFor' "{}" \; 调用它

答案2

至少使用 GNU grep,你可以这样做:

find / -name '*.tar.gz' -exec sh -c '
  for t; do 
    tar -tvf "$t" | grep -m1 -l --label="$t" "butterflyinmotion"
  done
' {} + 2>/dev/null

.tar.gz这将输出其档案中至少包含该模式的一个匹配项的文件的名称butterflyinmotion


使用 GNU tar,似乎可以(至少对于简单模式)省略 grep 并tar -tf直接使用 ex 的退出状态。

find / -name '*.tar.gz' -exec tar --wildcards -tf {} '*butterflyinmotion' \; -print 2>/dev/null

上面将打印匹配的文件(如果有),后跟存档的名称。

相关内容