如何使用 查找与某个模式匹配的每个文件和目录(不包括一个目录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