【问题标题】:Shell command to find files in a directory pattern用于在目录模式中查找文件的 Shell 命令
【发布时间】:2011-06-02 15:29:03
【问题描述】:

使用 shell 命令,我需要以以下目录模式列出服务器上的所有文件:

/home/*/public_html/images/*.php

手动执行此操作需要花费很长时间。当涉及到这些命令时,我真的不知道。

【问题讨论】:

  • 是的。这是正确的语法。它不工作吗?或者你想让它更快?如果是这样,则不可能进行固有的优化。只是替代方案和解决方法。 locate|grep 用于搜索缓存目录列表。

标签: linux bash shell console


【解决方案1】:
find /path/to/directory/.  -path "*/match/this/path/*" -type f -name "*.php"

【讨论】:

  • 谢谢,这正是我所需要的。它在/path/to/directory/foo/match/this/path/path/to/directory/foo/bar/match/this/path/baz/ 中查找文件
【解决方案2】:

Shell 脚本:

find /home/*/public_html/images -iname "*php" -exec echo {} \;

然后您可以更改 -exec 命令以对返回的文件执行任何您想要的操作。在这种情况下,我们会回应它们,但您也可以轻松地执行其他操作。

【讨论】:

  • 这将匹配/home/foo/public_html/images/file.php,但不匹配/home/foo/bar/public_html/images/file.php。有什么方法可以匹配任何深度的目录?
  • 正如下面另一个答案中提到的,使用-path 匹配任何深度的目录。 (例如,-path "*/images/*" would match any files in any path that has an images` 目录。)
【解决方案3】:

让 bash 为您展开文件并使用 ls 列出它们:

ls /home/*/public_html/images/*.php

示例输出:

/home/grant/public_html/images/bar.php
/home/grant/public_html/images/foo.php
/home/marcog/public_html/images/helloworld.php

【讨论】:

    【解决方案4】:

    使用 PHP glob 函数

    glob('/home/*/public_html/images/*.php')
    

    它将返回一个匹配路径字符串的数组。您也可以只使用:

    ls /home/*/public_html/images/*.php
    

    或:

    for i in /tmp/*/public_html/images/*.php;
    do 
    some_command "$i"
    done
    

    从外壳。

    【讨论】:

    • 我相信他是在 shell 中做的,而不是 php。
    • @marcog,它被标记为 PHP。但这并不重要。
    • PHP 标记可能只是来自他列出 .php 文件这一事实。
    • 从技术上讲,您可以将 PHP 用作 shell 脚本,尽管感觉很别扭。 ;)
    最近更新 更多