![在 tar 文件目录中查找所有包含模式的文件](https://linux22.com/image/674246/%E5%9C%A8%20tar%20%E6%96%87%E4%BB%B6%E7%9B%AE%E5%BD%95%E4%B8%AD%E6%9F%A5%E6%89%BE%E6%89%80%E6%9C%89%E5%8C%85%E5%90%AB%E6%A8%A1%E5%BC%8F%E7%9A%84%E6%96%87%E4%BB%B6.png)
我有一个目录中的所有 tar 文件。我想在不提取所有 tar 文件的情况下查找 tar 文件中的某些文件。
我知道如何使用一个 tar 文件:
tar tvf abc.tar | grep xyz
我想在所有 tar 文件中查找但我不知道如何做。
答案1
假设所有 tar 文件名都以 结尾.tar
。假设您要在所有这些 tar 文件中查找名称以 结尾的任何文件.dat
。基于这些假设,您可以使用:
$ for f in `find . -type f -name "*.tar" -print`; do tar tf $f | grep \.dat > /dev/null && echo $f; done
该find
命令用于获取.tar
文件列表;您最终可能会得到包含文件以外的文件的目录.tar
。对于.tar
找到的每个文件,列出其目录 ( tar tf
),以及grep
与我们的模式匹配的名称的目录。
.tar
上面的示例命令只是打印出包含与我们的模式匹配的文件的名称;如果你还想要查看匹配文件的名称,那么您可以删除> /dev/null
该命令的一部分grep
。
希望这可以帮助!
答案2
我建议你为这个任务创建一个小脚本。类似下面这样:
REGEX="my search string"
find . -type f -name '*.tar' -print0 | while read -r -d $'\0' FILE
do
# the sed command adds the filename prefix
tar tf "${FILE}" | grep -- "${REGEX}" | sed "s|^|${FILE}: |"
done