30

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

something.zip
this.zip
that.zip

都属于该类别。我正在尝试使用通配符对这些进行 grep,到目前为止我已经尝试过

grep ".*.zip"

但是每当我这样做时,它会发现.zip文件很好,但是如果在.zipso之后有其他字符.zippppppp或者.zipdsjdskjc仍然会被 grep 拾取,它仍然会显示输出。话虽如此,我应该怎么做才能防止 grep 显示在.zip?

4

11 回答 11

81

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

grep ".*\.zip$"

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

于 2012-11-11T21:53:17.853 回答
16

在 UNIX 上,尝试:

find . -type f -name \*.zip
于 2012-11-11T21:59:22.463 回答
5

你需要做几件事。它应该如下所示:

grep '.*\.zip$'

您需要转义第二个点,所以它只会匹配一个点,而不是任何字符。使用单引号使转义更容易一些。

您需要在行尾使用美元符号来表示您希望“zip”出现在行尾。

于 2012-11-11T21:54:06.197 回答
5

您还可以使用 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 结尾

于 2018-02-05T01:43:30.377 回答
3

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

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
于 2015-05-09T17:07:48.813 回答
2

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

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

于 2013-08-21T00:41:04.223 回答
2

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

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

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

这将获得文件扩展名,如“.mp3”等。

于 2015-03-24T12:33:27.043 回答
2

如果您只想在当前文件夹中查找,为什么不用这个没有 grep 的简单命令呢?

ls *.zip 
于 2020-01-10T15:56:05.707 回答
1

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

grep -i \.zip$
于 2015-04-23T18:23:38.877 回答
0

只需这样做:

grep ".*.zip$"

“$”表示行尾

于 2012-11-11T21:54:04.823 回答
-1
grep -r pattern --include="*.txt" /path/to/dir/
于 2021-08-26T10:56:02.763 回答