shell 路径扩展对 find -name 造成的影响

shell 路径扩展对 find -name 造成的影响

最近很多次在使用 find -name 时都会遇到一个问题。下面就是这类问题的示例:

[longyu@debian:21:20:27] ~ $ ls *.log
problem.log  system-error.log
[longyu@debian:21:20:31] ~ $ ls "*.log"
ls: cannot access *.log: No such file or directory
[longyu@debian:21:20:37] ~ $ ls '*.log'
ls: cannot access *.log: No such file or directory
[longyu@debian:21:20:41] ~ $ find ./ -name *.log
find: paths must precede expression: system-error.log
Usage: find [-H] [-L] [-P] [-Olevel] [-D help|tree|search|stat|rates|	opt|exec] [path...] [expression]
[longyu@debian:21:20:57] ~ $ find ./ -maxdepth 1 -name "*.log"
./system-error.log
./problem.log
[longyu@debian:21:21:13] ~ $ find ./ -maxdepth 1 -name \*\.log 
./system-error.log
./problem.log
[longyu@debian:21:21:19] ~ $ find ./ -maxdepth 1 -name \*.log
./system-error.log
./problem.log
[longyu@debian:21:21:22] ~ $ find ./ -maxdepth 1 -name '*.log'
./system-error.log
./problem.log
[longyu@debian:21:21:32] ~ $ 

从最上面 ls 命令的输出中可以发现,当前目录下存在两个后缀名为 log 的文件。紧接着的两个失败的 ls 命令只是用来说明 shell 的路径扩展对程序的执行可能造成的影响。shell 在执行子程序前会进行路径扩展,将通配符展开作为参数传递给子程序,包含在双引号中的变量也会进行变量名扩展。将通配符放在引号中是避免 shell 进行路径扩展的一种方案,也可以通过反斜杠转义的方式阻止 shell 进行路径扩展。这就是 find -name 出现问题的原因,这个问题是由 shell 造成的,而非子程序的 bug

关于这点,在 find 命令的 manual 文件中有如下描述:

NON-BUGS
$ find . -name *.c -print
find: paths must precede expression
Usage: find [-H] [-L] [-P] [-Olevel] [-D help|tree|search|stat|rates|opt|exec] [path…] [expression]

This happens because *.c has been expanded by the shell resulting in find actually receiving
a command line like this:

  find . -name bigram.c code.c frcode.c locate.c -print

That command is of course not going to work. Instead of doing things this way, you should
enclose the pattern in quotes or escape the wildcard:
$ find . -name *.c -print

在我上面的例子中, find 执行的命令行实际为:

find ./ -name problem.log system-error.log

这显然不符合 find 命令的格式,通过使用引号与转义字符便可以解决此问题,上面也给出了实例。

这个问题也会以其它的形式在我们使用其它命令时出现,这就要求我们要梳理 shell 的工作流程,至少我们必须要确保命令行是我们想要的格式,命令行很多时候都不是看上去那样,尽管我们常常这样认为!

如果有一天你发现变量名扩展也会造成问题,那么你只需要用单引号代替双引号即可避免变量名扩展。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值