在不同目录的 tar 存档中查找文件名

在不同目录的 tar 存档中查找文件名

我想编写一个批处理脚本:

  • 查找文件名
  • 文件名位于 tar 存档内
  • tar 存档位于不同的目录中
  • 文件名与给定模式匹配

我想要避免解皮,如果可能的话,并且想要将文件名存储在变量中

我的 tar 文件位于./foo_tar,名为bar.tar.gz.在 tar 存档中,我想获取以 开头的文件的文件名baz*,后跟一些数字和下划线(例如baz1234_)。

到目前为止,我知道该find命令,但在尝试访问 tar 文件时它不起作用。我想要这样的东西:

filename_in_question=$(find ./foo_tar/bar.tar.gz -name 'baz*')

有什么解决方法吗?

答案1

Tar 本身可以使用通配符

tar tzvf ./foo_tar/bar.tar.gz --wildcards '*/baz*'

例如。:

$ filename_in_question=$(tar tvf test.tar --wildcards '*/received_10205861111464136.mp4')
$ echo $filename_in_question
-rwxr-xr-x ghp/ghp 1931930 2017-11-04 10:36 ./Marieanne/Messenger/received_10205861111464136.mp4
$ echo ${filename_in_question/*\//}
received_10205861111464136.mp4

答案2

find仅搜索目录层次结构中存在的文件,而不搜索存档内存储的文件。您可以使用以下命令列出文件tar -t

tar -ztf ./foo_tar/bar.tar.gz --wildcards --no-anchored 'baz*'

--wildcards允许*被解释为通配符,并--no-anchored允许文件名在任何文件名之后匹配/(因此,如果它位于存档的子目录中,仍然会找到它)。

中的模式匹配tar不如 中的灵活find。对于您描述的模式,您可以通过以下方式过滤完整内容grep

tar -ztf ./foo_tar/bar.tar.gz | grep '\(^\|/\)baz[0-9]\+_'

由于要将结果保存在变量中,因此还需要使用将命令括起来命令替换:

filename_in_question=$(tar -ztf ./foo_tar/bar.tar.gz | grep '\(^\|/\)baz[0-9]\+_')

如果您使用的是,这仍然是必要的find

答案3

您需要一个内置的 tar 实现libfind

star -t -f ./foo_tar/bar.tar.gz -find -name 'baz*'

将按照您的预期工作,并且可以做更多的事情。

检查 schilytools 焦油球:http://sourceforge.net/projects/schilytools/files/

star是最古老的免费 tar 实现。请参阅手册页:

http://schilytools.sourceforge.net/man/man1/star.1.html

相关内容