파일 트리 깊은 곳에 중첩되어 있으며 해당 파일이 포함된 상위 디렉터리를 찾고 싶습니다.
예를 들어, 나는 중첩된 GIT 저장소 세트에 있고 .git
현재 있는 파일을 제어하는 디렉터리를 찾고 싶습니다. 같은 게 있었으면 좋겠다
find -searchup -iname ".git"
답변1
git rev-parse --show-toplevel
현재 저장소에 있는 경우 현재 저장소의 최상위 디렉터리가 인쇄됩니다.
기타 관련 옵션:
# `pwd` is inside a git-controlled repository
git rev-parse --is-inside-work-tree
# `pwd` is inside the .git directory
git rev-parse --is-inside-git-dir
# path to the .git directory (may be relative or absolute)
git rev-parse --git-dir
# inverses of each other:
# `pwd` relative to root of repository
git rev-parse --show-prefix
# root of repository relative to `pwd`
git rev-parse --show-cdup
답변2
일치 항목을 찾는 데 사용되는 첫 번째 매개 변수를 사용하는 Giles 답변의 일반 버전입니다.
find-up () {
path=$(pwd)
while [[ "$path" != "" && ! -e "$path/$1" ]]; do
path=${path%/*}
done
echo "$path"
}
심볼릭 링크의 사용을 유지하세요.
답변3
옵션 사용을 허용하는 보다 일반적인 버전 find
:
#!/bin/bash
set -e
path="$1"
shift 1
while [[ $path != / ]];
do
find "$path" -maxdepth 1 -mindepth 1 "$@"
# Note: if you want to ignore symlinks, use "$(realpath -s "$path"/..)"
path="$(readlink -f "$path"/..)"
done
예를 들어 (스크립트가 로 저장되었다고 가정 find_up.sh
)
find_up.sh some_dir -iname "foo*bar" -execdir pwd \;
... 해당 패턴이 있는 파일이 발견될 some_dir
때까지 인쇄될 모든 조상(자신 포함)의 이름입니다 ./
위 스크립트를 사용할 때 readlink -f
주석에 명시된 대로 심볼릭 링크를 따릅니다. realpath -s
이름으로 경로를 추적하려는 경우("bar"가 심볼릭 링크인 경우에도 "/foo/bar"는 "foo"로 올라감) 반대 접근 방식을 사용할 수 있습니다. 하지만 이렇게 하려면 realpath
설치되지 않은 대부분의 경로 를 설치해야 합니다. 기본적으로 플랫폼.
답변4
불가능하다는 것을 알았습니다. 나는 쉘 루프보다 더 간단한 것을 생각할 수 없습니다. (테스트되지 않음, 그렇지 않다고 가정 /.git
)
git_root=$(pwd -P 2>/dev/null || command pwd)
while [ ! -e "$git_root/.git" ]; do
git_root=${git_root%/*}
if [ "$git_root" = "" ]; then break; fi
done
Git 리포지토리의 특정 경우에는 Git이 작업을 수행하도록 할 수 있습니다.
git_root=$(GIT_EDITOR=echo git config -e)
git_root=${git_root%/*}