在查找中排除目录

在查找中排除目录

如何使用 查找与某个模式匹配的每个文件和目录(不包括一个目录find)?

假设我有以下文件结构;


  foo-排除-我/
    foo.txt
  foo-排除-我-不/
    foo.txt
  酒吧/
    foo.txt
    富巴/
      栏.txt
      foofoo.txt

我如何使用以下命令获得以下输出find

./bar/foo.txt
./酒吧/foobar
./bar/foobar/foofoo.txt
./foo-排除我-不
./foo-exclude-me-not/foo.txt

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

寻找 。 -name 'foo-exclude-me' -prune -o -name 'foo*'
寻找 。 -name 'foo*' \! -路径'./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目录?

答案1

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' -prune -o -name '*' -exec rm -f {} + -exec ls -l {} +

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

.:
总计 16
-rw-r--r--。 1 oradba dba 499 一月 18 19:30 a.out
-rw-r--r--。 1 oradba dba 499 一月 18 20:59 b.out
-rw-r--r--。 1 oradba dba 499 一月 18 20:59 c.out
-rw-r--r--。 1 oradba dba 499 一月 18 20:59 d.out
rm:无法删除`.':是一个目录
ls: 无法访问./b.out: 没有这样的文件或目录
ls: 无法访问 ./d.out: 没有这样的文件或目录
ls: 无法访问./c.out: 没有这样的文件或目录
.:
总计 4
-rw-r--r--。 1 oradba dba 499 一月 18 19:30 a.out

相关内容