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 그렇다면 git과 같은 특정 디렉터리를 한 번에 제외하도록 make find를 구성하는 방법은 무엇입니까?
답변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
목차. FreeBSD를 사용하여 인수로 전달된 각 디렉토리에 대해 깊이가 1인 디렉토리만 제거 find
하려면 .-depth 1
-name .git
.git
-mindepth 2
일부 (또는 2보다 큰 숫자)를 추가하면 결국 디렉토리가 탐색될 수 있습니다.
-prune
와 결합 (또는 암시) 할 수 없다는 점에 유의하세요.-depth
-delete
-depth
1 여기서 GNU 관리하기find
옵션 술어콘텐츠 앞에 콘텐츠를 삽입하면 경고가 표시되지 않습니다. 이를 위해 휴리스틱을 사용합니다. BSD를 사용하면 속을 수 있다myfind -f -my-dir-starting-with-dash-...
답변2
디렉터리를 무시하도록 구성할 수는 없습니다 find
. 이는 작동 방식이 아닙니다. 그러나 함수를 사용할 수 있습니다(매개변수를 허용하려면 함수가 필요하므로 별칭이 아님). 별칭을 추가하려는 쉘 초기화 파일에 다음을 추가하십시오.
my_find(){
path="$1"
shift
find "$path" -not \( -path ./.git -prune \) "$@"
}
그런 다음 다음과 같이 실행할 수 있습니다.
my_find /target/path -name something
이 접근 방식의 중요한 단점은 항상 대상 경로를 제공해야 하며 기본적으로 현재 디렉터리에서 검색할 수 없다는 것입니다.