【问题标题】:How to list specific type of files in recursive directories in shell?如何在shell的递归目录中列出特定类型的文件?
【发布时间】:2011-04-01 12:05:54
【问题描述】:

我们如何找到特定类型的文件,即嵌套目录中存在的 doc pdf 文件。

我试过的命令:

$ ls -R | grep .doc

但如果有像alok.doc.txt 这样的文件名,该命令也会显示该文件名,这显然不是我想要的。我应该改用什么命令?

【问题讨论】:

    标签: linux unix shell command-line command


    【解决方案1】:

    如果您的文件扩展名与文件类型不匹配,您可以使用file 实用程序。

    find $PWD -type f -exec file -N \{\} \; | grep "PDF document" | awk -F: '{print $1}'

    您可以使用要开始搜索的目录来代替$PWDfile 甚至打印出 PDF 版本。

    【讨论】:

      【解决方案2】:

      我们有一个类似的问题。我们想要一个包含路径的列表,包含 etc 目录中的所有配置文件。这有效:

      find /etc -type f \( -iname "*.conf" \)
      

      它提供了所有 .conf 文件及其路径的漂亮列表。输出如下:

      /etc/conf/server.conf
      

      但是,我们想对所有这些文件做一些事情,比如 grep 这些文件以在所有文件中查找单词或设置。所以我们使用

      find /etc -type f \( -iname "*.conf" \) -print0 | xargs -0 grep -Hi "ServerName"
      

      通过 grep 查找 /etc 中包含“ServerName”等设置的所有配置文件输出如下所示:

      /etc/conf/server.conf: ServerName "default-118_11_170_172"
      

      希望你觉得它有用。

      席德

      【讨论】:

        【解决方案3】:
        find . | grep "\.doc$"
        

        这也会显示路径。

        【讨论】:

          【解决方案4】:

          如果您更习惯使用“ls”和“grep”,您可以在 grep 命令中使用正则表达式来做您想做的事情(结尾的 '$' 字符表示 .doc 必须位于行尾. 那将排除“file.doc.txt”):

          ls -R |grep "\.doc$"
          

          更多关于在the man中使用grep和正则表达式的信息。

          【讨论】:

          • 转义点可能很好,否则像hellodoc 这样的文件也会匹配。 ls -R | grep "\.doc$"
          • 有没有办法让你看到ls找到的文件的完整路径?现在我只是一个所有文件的列表,但我现在不知道如何真正找到它们。
          • 永远不要在脚本中使用ls作为输入数据
          【解决方案5】:

          同样,如果您更喜欢使用通配符 *(不太像正则表达式建议),您可以使用 ls-l 标志来每行列出一个文件(如 grep)和 @987654324 @标志就像你一样。然后您可以使用*.doc 指定要搜索的文件 IE。要么

          ls -l -R *.doc
          

          或者如果您希望它以更少的行列出文件。

          ls -R *.doc
          

          【讨论】:

          • 你试过运行这个吗? mkdir tmp;光盘时间; mkdir a;触摸 a/a.doc; ls -l -R *.doc
          • ls: 无法访问 '*.doc': 没有这样的文件或目录
          【解决方案6】:

          其他一些可以使用的方法:

          echo *.{pdf,docx,jpeg}

          stat -c %n * | grep 'pdf\|docx\|jpeg'

          【讨论】:

            【解决方案7】:

            ls 命令输出主要供人类阅读。对于自动处理的高级查询,您应该使用更强大的find 命令:

            find /path -type f \( -iname "*.doc" -o -iname "*.pdf" \) 
            

            好像你有 bash 4.0++

            #!/bin/bash
            shopt -s globstar
            shopt -s nullglob
            for file in **/*.{pdf,doc}
            do
              echo "$file"
            done
            

            【讨论】:

            • 它是 */.pdf */.doc - 如果没有它,您就不会递归到子目录
            • 你可以做ls **/*.{pdf,doc}for file in **/*.{pdf,doc}
            • 哇,我输入了三个星号,它用一个替换了它 - 将来会知道的。
            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2014-01-18
            • 1970-01-01
            • 2013-06-24
            • 1970-01-01
            • 2011-04-09
            • 1970-01-01
            相关资源
            最近更新 更多