我尝试查找*.e*
与另一个文件 ( md.tpr
)位于同一目录中的一些文件 ( )。我需要使用以下内容列出它们(用于进一步处理):
find . -name md.tpr -execdir ls *.e* \;
Run Code Online (Sandbox Code Playgroud)
我尝试了此命令的一些变体和其他一些变体(包括单引号传递给的命令-execdir
或将其作为sh -c 'ls *.e*'
或eval 'ls *.e*'
仅举几例)。似乎通配符在传递给-exec
或时不起作用-execdir
。运行上述命令时出现的错误是:
ls: *.e*: No such file or directory
Run Code Online (Sandbox Code Playgroud)
就像一个健全性检查一样,我做-execdir pwd
了它并打印了它应该打印的内容,所以看起来它是 globbing 的问题,因为这些*.e*
文件确实存在于这个测试列出的目录中。
现在,我能够以一种不太优雅的方式解决这个问题,但它让我感到困惑,为什么通配符和通配符在这里不起作用。有任何想法吗?还是我完全偏离了轨道?
我使用 bash 3.2.25(旧的,但我在该系统上没有管理员权限)。
另外,有趣的是,如果我这样做
find ~ -name .bashrc -maxdepth 2 -execdir ls -d .b* \;
Run Code Online (Sandbox Code Playgroud)
除非从$HOME
.
小智 18
find 命令和 shell 都能够进行文件 globbing。
这是不寻常的 - 大多数命令无法进行 globbing 并完全依赖 shell 来扩展 globs。但是 find 是一个超级超级超级超级用户工具,你很容易用它来伤害自己!
示例:当你执行命令时
find /path -iname *.txt
Run Code Online (Sandbox Code Playgroud)
发生的第一件事是 shell 尝试在当前目录中查找与 *.txt 匹配的所有文件。如果找到,它将用所有匹配文件的名称替换glob,然后调用 find 命令。如果发生这种情况,find 命令永远不会看到 glob,shell 已将其扩展为不存在。
但是,如果当前目录中没有与 glob 匹配的文件,shell 会耸耸肩,将 glob 原封不动地传递给 find。所以在这一点上, find 命令(它理解 globs,记住)将输出它在 /path 下找到的与 glob 匹配的所有文件的名称。
因此,以这种方式使用 globs 意味着 find 的行为将根据当前目录的内容而有所不同。这几乎肯定不是您想要的!
为了防止 shell 在 find 看到它们之前篡改 glob,请使用适当的 shell 元字符引用对 glob 进行转义。 通常这只是意味着将您的全局字符串放在这样的单引号中
find /path -iname '*.txt'
Run Code Online (Sandbox Code Playgroud)
请记住,GLOBS 不是正则表达式 - glob ".*" 和正则表达式 ".*" 非常不同并且不匹配相同的字符串!
jw0*_*013 11
当您键入一个包含像.b*
或那样不带引号的 glob 的命令时,*.e*
shell 会为您展开它。这发生在find
从未见过它之前。
你可能有这样的文件.bashrc
,.bash_history
在你的,等$HOME
目录。因此,当运行 from 时$HOME
,您的命令将变为find ... -execdir ls -d .bashrc .bash_history ... \;
. 从其他地方运行时,.b*
glob 不匹配任何内容,因此它会通过。这仍然不起作用,因为find -exec
对*
globs没有任何作用。如果您希望为 扩展 glob -exec
,则需要调用 shell 来执行此操作:
find ... -execdir sh -c 'echo globs: *' \;
Run Code Online (Sandbox Code Playgroud)