首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >明白-exec命令吗?

明白-exec命令吗?
EN

Unix & Linux用户
提问于 2019-08-20 05:55:24
回答 1查看 584关注 0票数 0

这行得通

代码语言:javascript
复制
find ./ -iname '*.c' -o -name '*.h' -o -name '*.l' -exec grep -irn test1 {} \;

如果我将-exec与ls结合起来,它就会告诉我这是一个不恰当的选项。

代码语言:javascript
复制
#ls -exec touch {} \;
ls: invalid option -- 'e'
Try 'ls --help' for more information.

我的理解是-exec选项只用于查找而不是其他命令吗?

EN

回答 1

Unix & Linux用户

发布于 2019-08-20 06:27:27

学习有关命令的最好方法是阅读它的手动info ls/info findman ls/man find。或者每个POSIX规范来了解所有不同实现应该通用的子集。

find的语法是

代码语言:javascript
复制
find [options] <file1> [<file2>...] [predicates]

(一些find实现允许跳过<file1>)

ls

代码语言:javascript
复制
ls [options] [<file1> [<file2>...]]

(其中[...]表示可选部分)。

标准选项是单一字母,并引入了-。有些人拿论点,有些人不。选项可以合并在一个单一的论点。例如,ls -l -d可以编写为ls -ld

因此,您可以看到-exec永远不会是一个选项,因为find会将其解释为-e -x -e -c (如果-x选项使用参数,则可能是-e -x ec )。

一些工具实现支持长选项,但这些选项的前缀是--,而不是-,以避免这种冲突。例如,GNU find和GNU ls都支持--help选项。

对于find-exec是POSIX所称的谓词。这不是一种选择。它是在文件列表之后出现的表达式的一部分,用于确定选择了哪些文件以及如何处理这些文件。

find还支持一些选项(在文件列表之前),比如影响全局行为的-L/-H

ls没有谓词的概念,也没有用于选择文件的表达式。它的行为只受各种选择的影响。没有任何选项可以让ls执行任意命令。

顺便说一句,您的代码有一些问题:

  • -a (省略时隐含)优先于-o,因此您的-exec只对*.l文件运行。请参阅find具有多重性-name-exec只执行最后的匹配。-name
  • 你用-rgrep。这是一些grep实现支持的一个非标准选项,用于执行find的S任务,并在目录中查找文件。尽管在这里可能无害,但如果find找到的任何文件都不是目录类型,则可能不需要。
  • 使用{} \;语法,每个文件运行一个grep。这是非常低效率的,这也意味着grep不会显示文件的名称(除非上面的-r启动)
  • 请注意,-iname是一个非标准扩展(如果它是GNU扩展,您可以在系统的info find中找到它,但在POSIX规范中找不到它)。
  • 由于不使用-type谓词,find将报告任何类型的文件,而不仅仅是常规文件。可能包括目录设备fifos..。使用-type f将搜索限制在常规文件上。使用GNU find,您还可以使用-xtype f来选择在符号链接解析后成为常规文件的文件。

为了解决这些问题,你可以:

代码语言:javascript
复制
find . -name '*.[cChl]' -type f -exec grep -in test1 /dev/null {} +
票数 2
EN
页面原文内容由Unix & Linux提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://unix.stackexchange.com/questions/536375

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档