我想find
用来匹配路径,但我发现了这个:
-path pattern
文件名与外壳模式模式匹配。元字符不处理
/' or
。特别; 所以,例如,find . -path "./sr*sc"
./src/misc
将为名为(如果存在)的目录打印一个条目。
我怎样才能让它只匹配当前目录中的文件?我需要其他工具来完成这项工作吗?
编辑。正如这里所建议的,这里有一些细节。做这项工作有-maxdepth
和-regex
使用。然而,在实际应用程序中,路径可能是一个变量而不是一个简单的常量,这-maxdepth
不会很好地工作并且-regex
可能看起来有点矫枉过正。所以我想知道是否有一个简单的解决方案find
让它尊重斜线。下面是描述其行为的 rsync 文档,它与我想要的非常接近。
目前最好的解决方案是使用正则表达式,但如果你知道任何可以使它更简单的东西,那将是受欢迎的。
作为我想要的一个例子,这里是 rsync 模式规则:
'*' 匹配任何路径组件,但它在斜杠处停止。
使用 '**' 匹配任何内容,包括斜线。
改为使用
-regex
。该模式锚定在开始和结束处,因此您可能需要.*
在开始和结束处使用。用于替换不匹配[^/]*/
的 glob 。例如:*
/
有一个小的 Perl 脚本find2perl声称将参数转换为
find
命令到等效的 Perl 脚本。显然,它将具有与-path
as相同的模式匹配find
,但您可以对其进行编辑以接受另一个参数,例如-glob
,然后它将使用系统调用fnmatch()
来执行您想要的那种通配。我对我的版本进行了快速修改,find2perl
如下面的补丁所示:(开头的行
+
显示了我添加的 3 行)。我需要为 Fedora 添加perl-App-find2perl
软件包perl-File-FnMatch
。您需要在系统上找到等效项。然后,您可以运行类似的命令
为了防止
find
递归到子目录,使用-maxdepth
标志zsh
一些 shell ,例如bash
和ksh93
支持**
文件名通配模式。zsh
默认情况下启用它,而必须bash
使用和shopt -s globstar
启用它。ksh93
set -o globstar
这意味着您应该能够做到,例如,
一些
find
类似的测试,例如-type f
,可以很容易地合并到这里: