如何配置以永久排除find
命令的某些目录。
https://stackoverflow.com/questions/4210042/how-to-exclude-a-directory-in-find-command
我尝试将以下别名添加到 bashrc
alias find='find -not \( -path ./.git -prune \)'
似乎不起作用。
在 ripgrep 中你可以配置它。https://github.com/BurntSushi/ripgrep/blob/master/GUIDE.md#configuration-file 那么如何一次性配置 make find 排除某些目录,例如 git。
答案1
我会将其编写为myfind
包装脚本,例如:
#! /bin/sh -
predicate_found=false skip_one=false
for arg do
if "$skip_one"; then
skip_one=false
elif ! "$predicate_found"; then
case $arg in
(-depth | -ignore_readdir_race | -noignore_readdir_race | \
-mount | -xdev | -noleaf | -show-control-chars) ;;
(-files0-from | -maxdepth | -mindepth) skip_one=true;;
(['()!'] | -[[:lower:]]?*)
predicate_found=true
set -- "$@" ! '(' -name .git -prune ')' '('
esac
fi
set -- "$@" "$arg"
shift
done
if "$predicate_found"; then
set -- "$@" ')'
else
set -- "$@" ! '(' -name .git -prune ')'
fi
exec find "$@"
它!
(
-name
.git
-prune
)
在第一个非选项谓词之前插入(如果没有找到谓词,则在末尾插入),并将其余部分包装在 和 之间(
,)
以避免使用-o
.
例如,myfind -L . /tmp /etc -maxdepth 1 -type d -o -print
会变成find -L . /tmp /etc -maxdepth 1 ! '(' -name .git -prune ')' '(' -type d -o -print ')'
.
那prune
是全部 .git
目录。要仅修剪作为参数传递的每个目录的深度为 1 的目录,使用 FreeBSD 的find
,您可以在-depth 1
before 中添加一个-name .git
.
.git
如果添加一些-mindepth 2
(或任何大于 2 的数字),目录最终可能会被遍历。
请注意不能与(或暗示)-prune
结合使用。-depth
-delete
-depth
1 在这里照顾 GNUfind
选项谓词如果您在它们之前插入内容,以避免出现警告。它为此使用启发式方法。如果你使用 BSD 的话,它可能会被愚弄myfind -f -my-dir-starting-with-dash-...
答案2
您无法配置find
为忽略目录,这不是它的工作原理。但是,您可以使用函数(不是别名,因为您需要它能够接受参数)。将其添加到您尝试添加别名的 shell 初始化文件中:
my_find(){
path="$1"
shift
find "$path" -not \( -path ./.git -prune \) "$@"
}
然后你可以运行这样的东西:
my_find /target/path -name something
这种方法的一个显着缺点是您需要始终给出目标路径并且不能默认在当前目录中搜索。