从压缩目标文件的存档文件列表中查明存档文件

Pinpoint archive file from a list of archive files where the target file is zipped

我有这样的目录结构-

./Archive1
./Archive1/Archive2
./Archive1/Archive3

每个目录下有很多tar个文件。举个例子(不要用名字,它们只是例子)-

Archive1
├── Archive2
│   ├── tenth.tar.gz
│   └── third.tar.gz
├── Archive3
│   ├── fourth.tar.gz
│   └── sixth.tar.gz
├── fifth.tar.gz
├── first.tar.gz
└── second.tar.gz

现在我有一个文件 file.txt,它可以驻留在任何 tar 文件中。我需要一个命令,它可以给我输出 tar 文件有我的输入文件 (file.txt) 以及 tar 文件的绝对路径。

例如,如果 test.txtsixth.tar.gz 中。输出将是 sixth.tar.gz./Archive1/Archive3/

目前我有这个命令,但是这个命令的缺点是,它列出了所有 tar 个文件 -

find . -maxdepth "3" -type f -name "*.tar.gz" -printf [%f]\n -exec tar -tf {} \; | grep -iE "[\[]|file.txt"

对于每个 tar 文件,您可以 运行 tar | grep,如果匹配,则打印 tar 文件的名称。一种方法是 运行 为每个 tar 文件执行 shell 命令。对于少量文件,如果性能不是太重要,这可能就足够了,而且相当简单。

find . -maxdepth "3" -type f -name "*.tar.gz" -exec sh -c 'tar tf {} | grep -iEq "[\[]|file.txt" && echo {}' \;

例如,如果 test.txtsixth.tar.gz 中,输出将是 ./Archive1/Archive3/sixth.tar.gz