我想使用find命令排除目录。
我有这个:
GLUE="$GLUE -not -iwholename */dir3/*"
我想在GLUE
命令(find
)中使用find $GLUE [...]
变量。不幸的是,我-not -iwholename */dir3/*
代替GLUE
而不是-not -iwholename dir3/file1 dir3/file2 dir3/file3
,即*/dir3/*
变成符合此条件的文件名。当然,find
因此而无效。怎么阻止?
答案 0 :(得分:2)
find ./ -iname ! -iname <dirname of file name to be not part of search results>
find ./ -iname <file name> ! -path "./dirt o be Excluded/*"
我希望有人帮忙
答案 1 :(得分:2)
让我先回答这个问题:
如何在从搜索中排除目录时使用
find
递归搜索?我的find
命令支持-prune
操作和公共扩展(例如,由GNUfind
提供)。
您很幸运,find
支持-prune
行动。恭喜!
在这种情况下,只需添加:
\! \( -name 'dir_to_exclude' -prune \)
如果find
处理的当前名称为dir_to_exclude
,并且同时从搜索树 1 修剪(即剪切该分支),则此值为false
试试吧(在暂存目录中):
$ mkdir {a,b,c,d}/{,1,2,3}
$ touch {a,b,c,d}/{,1,2,3}/{file1,file2}
$ tree
.
|-- a
| |-- 1
| | |-- file1
| | `-- file2
| |-- 2
| | |-- file1
| | `-- file2
| |-- file1
| `-- file2
|-- b
| |-- 1
| | |-- file1
| | `-- file2
| |-- 2
| | |-- file1
| | `-- file2
| |-- file1
| `-- file2
`-- c
|-- 1
| |-- file1
| `-- file2
|-- 2
| |-- file1
| `-- file2
|-- file1
`-- file2
9 directories, 18 files
$ find \! \( -name a -prune \)
.
./b
./b/file2
./b/1
./b/1/file2
./b/1/file1
./b/file1
./b/2
./b/2/file2
./b/2/file1
./c
./c/file2
./c/1
./c/1/file2
./c/1/file1
./c/file1
./c/2
./c/2/file2
./c/2/file1
看起来不错!
现在,您不应该将您的参数放在变量中find
(或者更常见的是您的命令和参数),而是将放入数组中!如果你不是很快就会遇到包含空格的参数的问题,或者像你的OP中那样遇到通配符。
将您的glue
内容放入数组中:例如,查找名称中包含1
并且为空 2 的所有文件:
glue=( '-name' '*1*' '-type' 'f' '-empty' )
然后的数组排除此目录:
exclude_dir=( '!' '(' '-name' 'a' '-prune' ')' )
然后查找名称中包含1
并且为空的所有文件,同时排除目录a
(与之前相同的临时目录中):
$ find "${exclude_dir[@]}" "${glue[@]}"
./b/1/file1
./b/file1
./b/2/file1
./c/1/file1
./c/file1
./c/2/file1
看起来真的好! (并观察报价!)。
1
如果您确实希望确保仅排除名称为dir_to_exclude
的目录,以防您有一个名为dir_to_exclude
的文件,则可以这样指定:
\! \( -name 'dir_to_exclude' -type d -prune \)
2
我在这里使用了很多引号。只是一个好习惯,实际上可以节省我的通配符部分*1*
和括号!