在一个目录模式中查找文件的Shell命令

16

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

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

手动完成这个过程比较耗时,而且我对这些命令一窍不通。


1
是的。那就是正确的语法。它不能工作吗?或者你想让它更快吗?如果是这样,那么没有固有的优化方法。只有替代方案和解决方法。locate|grep 是搜索缓存目录列表的一种方法。 - mario
4个回答

34
find /path/to/directory/.  -path "*/match/this/path/*" -type f -name "*.php"

2
谢谢,这正是我需要的。它可以在/path/to/directory/foo/match/this/path/path/to/directory/foo/bar/match/this/path/baz/中查找文件。 - The Unknown Dev

15

Shell脚本:

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

你可以更改-exec命令,对返回的文件执行任何所需操作。在这种情况下,我们使用echo命令,但是您也可以轻松执行其他操作。


2
这将匹配 /home/foo/public_html/images/file.php,但不匹配 /home/foo/bar/public_html/images/file.php。有什么办法可以匹配任意深度的目录吗? - The Unknown Dev
如下面的答案所述,使用-path可以匹配任意深度的目录。(例如,-path "*/images/*"将匹配任何路径中具有images目录的文件。) - Marcus

5

让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

-1

使用 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 中。


我相信他是在shell中做这个,而不是在php中。 - moinudin
@marcog,它被标记为PHP。但这并不重要。 - Matthew Flaschen
PHP标签可能只是因为他列出了.php文件。 - moinudin
1
从技术上讲,你可以将PHP用作shell脚本,尽管这感觉有些尴尬。 ;) - jamesmortensen

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接