如何传递多个动态! -要查找的路径参数

如何传递多个动态! -要查找的路径参数

我有一个文件,其中包含我想在使用 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

相关内容