我想编写一个批处理脚本:
- 查找文件名
- 文件名位于 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 实现。请参阅手册页: