하위 디렉터리 대신 상위 디렉터리에서 검색어 찾기

하위 디렉터리 대신 상위 디렉터리에서 검색어 찾기

파일 트리 깊은 곳에 중첩되어 있으며 해당 파일이 포함된 상위 디렉터리를 찾고 싶습니다.

예를 들어, 나는 중첩된 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%/*}

관련 정보