如何grep文件扩展名

时间:2012-11-11 21:50:42

标签: regex bash grep

我正在尝试创建一个脚本,该脚本将grep输入以查看某些内容是否属于某种文件类型(例如zip),尽管文件类型之前的文本可能是任何内容,例如

something.zip
this.zip
that.zip

都属于该类别。我试图使用通配符grep这些,到目前为止,我已经尝试过这个

grep ".*.zip"

但每当我这样做时,它会发现.zip文件很好,但如果.zip之后还有其他字符,它仍会显示输出,例如.zippppppp或{ {1}}仍然会被grep接收。话虽如此,我应该怎么做才能防止grep在.zipdsjdskjc之后显示包含其他字符的匹配?

10 个答案:

答案 0 :(得分:46)

使用$测试行尾,并使用反斜杠转义第二个.,使其仅匹配句点而不是任何字符。

grep ".*\.zip$"

但是,如果要列出当前目录中的所有ls *.zip文件,或.zip列出所有find . -name "*.zip"文件,.zip是更自然的方法。从(和包括)当前目录开始的子目录。

答案 1 :(得分:14)

在UNIX上,尝试:

find . -name \*.zip -print

答案 2 :(得分:5)

你需要做几件事。它应该是这样的:

grep '.*\.zip$'

你需要逃避第二个点,所以它只匹配一个点,而不是任何角色。使用单引号可以使转义更容易。

你需要在行尾的美元符号表示你想要" zip"发生在行尾。

答案 3 :(得分:2)

尝试:grep -o -E "(\\.([A-z])+)+"

我用它来获得多点/多点扩展。因此,如果输入为hello.tar.gz,则输出.tar.gz。 对于单点,请使用grep -o -E "\\.([A-z])+$"。 在Cygwin / MingW + MSYS上测试。

答案 4 :(得分:2)

我用它来获取文件夹中文件类型的列表。

find . -type f | egrep -i -E -o "\.{1}\w*$" | sort -su

输出例如:

.DS_Store
.MP3
.aif
.aiff
.asd
.doc
.flac
.jpg
.m4a
.m4p
.m4r
.mp3
.pdf
.png
.txt
.wav
.wma
.zip

奖金:

find . -type f | egrep -i -E -o "\.{1}\w*$" | sort | uniq -c

您将获得文件计数:

    106 .DS_Store
     35 .MP3
     89 .aif
      5 .aiff
    525 .asd
      1 .doc
     60 .flac
     48 .jpg
    149 .m4a
     11 .m4p
      1 .m4r
  12844 .mp3
      1 .pdf
      5 .png
      9 .txt
    108 .wav
     44 .wma
      2 .zip

答案 5 :(得分:2)

您还可以使用grep查找具有特定扩展名的所有文件:

find .|grep -e "\.gz$"

.表示当前文件夹。 如果要指定当前文件夹以外的文件夹,只需将.替换为文件夹的路径即可。 下面是一个示例:让我们找到以.gz结尾并位于文件夹/ var / log

中的所有文件
  find /var/log/ |grep -e "\.gz$"

输出类似于以下内容:

 ✘ ⚙> find /var/log/ |grep -e "\.gz$"

/var/log//mail.log.1.gz
/var/log//mail.log.0.gz
/var/log//system.log.3.gz
/var/log//system.log.7.gz
/var/log//system.log.6.gz
/var/log//system.log.2.gz
/var/log//system.log.5.gz
/var/log//system.log.1.gz
/var/log//system.log.0.gz
/var/log//system.log.4.gz

$符号基本上是文件扩展名以gz

结尾的统计信息

答案 6 :(得分:1)

上述示例的另一个修复/插件:

# multi-dotted/multiple extensions
grep -oEi "(\\.([A-z0-9])+)+" file.txt

# single dotted
grep -oEi "\\.([A-z0-9])+$" file.txt

这将获得类似'.mp3'等文件扩展名

答案 7 :(得分:1)

只是回顾一些其他答案。 .*不是必需的,如果您正在寻找某个文件扩展名,最好包含-i,以便它不区分大小写;例如,如果文件是HELLO.ZIP。我认为报价也不是必要的。

grep -i \.zip$

答案 8 :(得分:1)

如果只想在当前文件夹中查找,为什么不使用不带grep的简单命令呢?

ls *.zip 

答案 9 :(得分:0)

简单地说:

grep ".*.zip$"

“$”表示行尾