这行得通
find ./ -iname '*.c' -o -name '*.h' -o -name '*.l' -exec grep -irn test1 {} \;如果我将-exec与ls结合起来,它就会告诉我这是一个不恰当的选项。
#ls -exec touch {} \;
ls: invalid option -- 'e'
Try 'ls --help' for more information.我的理解是-exec选项只用于查找而不是其他命令吗?
发布于 2019-08-20 06:27:27
学习有关命令的最好方法是阅读它的手动info ls/info find或man ls/man find。或者每个POSIX规范来了解所有不同实现应该通用的子集。
find的语法是
find [options] <file1> [<file2>...] [predicates](一些find实现允许跳过<file1>)
和ls:
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-r做grep。这是一些grep实现支持的一个非标准选项,用于执行find的S任务,并在目录中查找文件。尽管在这里可能无害,但如果find找到的任何文件都不是目录类型,则可能不需要。{} \;语法,每个文件运行一个grep。这是非常低效率的,这也意味着grep不会显示文件的名称(除非上面的-r启动)-iname是一个非标准扩展(如果它是GNU扩展,您可以在系统的info find中找到它,但在POSIX规范中找不到它)。-type谓词,find将报告任何类型的文件,而不仅仅是常规文件。可能包括目录设备fifos..。使用-type f将搜索限制在常规文件上。使用GNU find,您还可以使用-xtype f来选择在符号链接解析后成为常规文件的文件。为了解决这些问题,你可以:
find . -name '*.[cChl]' -type f -exec grep -in test1 /dev/null {} +https://unix.stackexchange.com/questions/536375
复制相似问题