我有一个文件,其中包含我想在使用 find 进行搜索时忽略的目录/文件列表。它看起来像这样:
.git
.vim
config
.vimrc
.bashrc
此列表并不详尽,可以包含任意数量的项目。使用find
.时如何忽略这些文件/目录?
我一直在尝试这样做find . -type f ! -path ...
,但无法将动态列表作为参数传递。
答案1
通过支持扩展正则表达式(在 BSD 中、在 GNU 中)find
的实现,您可以执行以下操作:-regex
-E -regex
-regextype posix-extended -regex
find . -regextype posix-extended -regex "\./($(
sed 's@[][\\|^$.*+?{}()]@\\&@g' < list | paste -sd '|' -))" -prune -o \( \
-type f -print \)
这排除了这些文件/目录以及其中的任何文件/子目录(find
由于 ,甚至不会下降到它们中-prune
)。
如果想要匹配目录树中任何级别的任何文件/目录(而不是仅匹配 中的文件/目录).
,请将 更改\.
为.*
.
答案2
我会为此定义一个包装函数:
find_exclude(){
while read -r ext; do set "$@" \! -name "$ext"; done
find . -type f "$@"
}
$ find -type f
./config
./.vim
./dir/.git
./list
$ cat list
.vim
.git
config
$ find_exclude <list
./list