在查找中排除目录


11

如何查找与模式匹配的每个文件和目录,但不使用来查找一个目录find

说我有以下文件结构;

。
  foo-exclude-me /
    foo.txt
  foo-exclude-me-not /
    foo.txt
  酒吧/
    foo.txt
    foob​​ar /
      bar.txt
      foofoo.txt

我将如何使用以下输出find

./bar/foo.txt
./bar/foobar
./bar/foobar/foofoo.txt
./foo-exclude-me-not
./foo-exclude-me-not/foo.txt

我尝试使用以下两个命令:

找 。-name'foo-exclude-me'-修剪-o -name'foo *'
找 。-name'foo *'\!-path'./foo-exclude-me/*'

但是他们两个都返回此:

./bar/foo.txt
./bar/foobar
./bar/foobar/foofoo.txt
./foo-exclude-me # << this should be excluded
./foo-exclude-me-not
./foo-exclude-me-not/foo.txt

如何正确排除foo-exclude-me目录?


尝试使用foo-exclude-me代替./foo-exclude-me。也可以尝试-print在命令末尾附加。
13年

@MaxMackie完美:)
Tyilo

它固定了吗?哪种解决方法对您有用?我可以将其放在答案中而不是评论中。
13年

@MaxMackie同时使用-printfoo-exclude-me而不是./foo-exclude-me
Tyilo 2013年

太棒

Answers:


11
find . -name 'foo-exclude-me' -prune -o -name 'foo*' -print

如果为no -print,则隐式默认操作将应用于所有匹配项,即使是已修剪的匹配项也是如此。显式-print仅在指定条件下适用,这些条件-name 'foo*'仅在中的else分支中-name 'foo-exclude-me'

一般而言,-print在执行比谓词连接更复杂的操作时,请使用显式。

您的第二次尝试! -path './foo-exclude-me/*'不起作用,因为./foo-exclude-me不匹配./foo-exclude-me/*(没有尾随/)。添加! -path ./foo-exclude-me将起作用。


-2
-bash-4.1 $查找。-exec ls -l {} + -name'a.out'-修剪-o -name'*'-exec rm -f {} + -exec ls -l {} +

-rw-r--r--。1 oradba dba 499 1月18日19:30 ./a.out
-rw-r--r--。1 oradba dba 499 Jan 18 20:59 ./b.out
-rw-r--r--。1 oradba dba 499 Jan 18 20:59 ./c.out
-rw-r--r--。1 oradba dba 499 Jan 18 20:59 ./d.out

:
总共16
-rw-r--r--。1 oradba dba 499 Jan 18 19:30 a.out
-rw-r--r--。1 oradba dba 499 1月18日20:59出局
-rw-r--r--。1 oradba dba 499 1月18日20:59 c.out
-rw-r--r--。1 oradba dba 499 Jan 18 20:59 d.out
rm:无法删除“。”:是目录
ls:无法访问./b.out:没有此类文件或目录
ls:无法访问./d.out:无此类文件或目录
ls:无法访问./c.out:没有此类文件或目录
:
共4个
-rw-r--r--。1 oradba dba 499 Jan 18 19:30 a.out


使用prune选项跳过a.out并可以正常工作
-art.s

您绝对不解释为什么-prune相关。 -prune是最复杂的选项之一,find因为它会禁用-print(默认情况下已启用)
grochmal's

-修剪True; 如果文件是目录,请不要进入该目录。-因此它本身不会作为保护进入目录。- art.s
user211226
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.