config find 命令排除某些目录

config find 命令排除某些目录

如何配置以永久排除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 1before 中添加一个-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 

这种方法的一个显着缺点是您需要始终给出目标路径并且不能默认在当前目录中搜索。

相关内容