我试图找到所有文件的名称匹配某些C++文件扩展,但排除某些目录匹配模式与此:

find /home/palchan/code -name "*.[CcHh]" -o -name "*.cpp" -o -name "*.hpp" -a ! -name "*pattern*"

这仍然给了我一些输出文件,比如:
/home/palchan/code/libFox/pattern/hdr/fox/RedFox.H

哪个有图案?
下面是一个例子:
> ls -R .
.:
libFox

./libFox:
RedFox.C  RedFox.H  pattern

./libFox/pattern:
RedFox.C  RedFox.H

然后我跑:
> find . \( -name "*.[HC]" -a ! -name "*pattern*" \)
./libFox/pattern/RedFox.C
./libFox/pattern/RedFox.H
./libFox/RedFox.C
./libFox/RedFox.H

最佳答案

以下方法应该有效:

find /home/palchan/code \( -name "*pattern*" \) -prune -o -type f \( -name "*.[CcHh]" -o -name "*.cpp" -o -name "*.hpp" \) -print

man find
 -name pattern
          Base of file name (the path with the leading directories removed) matches shell pattern pattern.  The metacharacters (`*', `?', and `[]')  match
          a  `.'  at the start of the base name (this is a change in findutils-4.2.2; see section STANDARDS CONFORMANCE below).  To ignore a directory and
          the files under it, use -prune; see an example in the description of -path.  Braces are not recognised as being special, despite the  fact  that
          some  shells  including  Bash  imbue  braces  with  a special meaning in shell patterns.  The filename matching is performed with the use of the
          fnmatch(3) library function.   Don't forget to enclose the pattern in quotes in order to protect it from expansion by the shell.

因此,基本上,应该使用-prune排除目录,而不是! -name something

关于linux - 我的find命令用法有什么问题?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/14719755/

10-12 00:43
查看更多