BASH :: 从命令行在存档中查找文件

Posted

技术标签:

【中文标题】BASH :: 从命令行在存档中查找文件【英文标题】:BASH :: find file in archive from command line 【发布时间】:2009-11-05 17:13:08 【问题描述】:

我知道如何使用 find 查找文件

# find /root/directory/to/search -name 'filename.*'

但是,如何查看档案,因为文件可以压缩到里面...

感谢

【问题讨论】:

【参考方案1】:

我定义了一个函数(zsh,小改动 -> BaSh)

## preview archives before extraction
# Usage:        show-archive <archive>
# Description:  view archive without unpack
  show-archive() 
        if [[ -f $1 ]]
        then
                case $1 in
                        *.tar.gz)      gunzip -c $1 | tar -tf - -- ;;
                        *.tar)         tar -tf $1 ;;
                        *.tgz)         tar -ztf $1 ;;
                        *.zip)         unzip -l $1 ;;
                        *.bz2)         bzless $1 ;;
                        *)             echo "'$1' Error. Please go away" ;;
                esac
        else
                echo "'$1' is not a valid archive"
        fi
  

你可以

find /directory -name '*.tgz' -exec show-archive  \| grep filename \;

【讨论】:

看起来不错。一些 cmets:为什么 .tar.gz 是 gunzip+tar,而 .tgz 是 tar -zt?反正他们都是一样的。 bzless 在脚本中也做得不太好;-) 而且文件可能无论如何都是 tar.bz2,所以你真的需要 tar -jt 顺便说一句,这只会显示匹配文件的路径 inside 存档,这样你就不会知道存档的名称。 我可以建议使用file 命令来确定存档类型而不是文件扩展名【参考方案2】:

find /directory -name '*.tgz' -exec tar ztf \| grep filename \; 或类似的东西......但我不认为有一个“简单”的解决方案。

【讨论】:

【参考方案3】:

如果您的存档是某种压缩的 tarball,您可以使用 tar 搜索特定文件并仅打印该文件名的功能。如果你的 tar 支持通配符,你也可以使用它们。例如,在我的系统上:

tar tf sprt12823.logs.tar --wildcards *tomcat*

打印:

tomcat.log.20090105

虽然 tarball 中有更多文件,但只有一个匹配模式“*tomcat*”。这样你就不必使用 grep。

您可以将其与 find 和 gunzip 或您使用过的任何其他压缩实用程序结合使用。

【讨论】:

以上是关于BASH :: 从命令行在存档中查找文件的主要内容,如果未能解决你的问题,请参考以下文章

Bash:从脚本中查找并替换文本

使用 Bash 查找和复制文件 [重复]

Linux Bash-文件查找

使用 PHP 在存档中查找特定文件

Bash:在行尾查找带有尾随空格的文件

在 7z 单文件存档中随机查找