从压缩目标文件的存档文件列表中精确定位存档文件

时间:2016-11-25 13:58:36

标签: linux bash tar

我有一个像这样的目录结构 -

./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.txt位于sixth.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"

1 个答案:

答案 0 :(得分:1)

对于每个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.txt位于sixth.tar.gz,则输出将为./Archive1/Archive3/sixth.tar.gz