긴 경로에서 첫 번째 누락된 디렉토리를 찾는 방법은 무엇입니까?

긴 경로에서 첫 번째 누락된 디렉토리를 찾는 방법은 무엇입니까?

존재하지 않는 경로가 있다고 가정해 보세요.

$ ls /foo/bar/baz/hello/world
ls: cannot access /foo/bar/baz/hello/world: No such file or directory

하지만 우리는 말할 수 있어요/foo/bar 하다존재하다. 이것이 baz경로의 중단점 인지 확인하는 빠른 방법이 있습니까 ?

나는 배쉬를 사용하고 있습니다.

답변1

제가 가장 좋아하는 유틸리티 중 하나는namei, 부분util-linux따라서 일반적으로 Linux에만 나타납니다.

$ namei /usr/share/foo/bar
f: /usr/share/foo/bar
 d /
 d usr
 d share
   foo - No such file or directory

그러나 그 출력은 구문 분석하기가 쉽지 않습니다. 따라서 누락된 부분을 지적하고 싶다면 namei유용할 수 있습니다.

구성 요소가 링크인지 마운트 지점인지 및 해당 권한을 선언하도록 할 수 있으므로 경로에 액세스할 때 일반적인 문제를 해결하는 데 유용합니다.

$ ln -sf /usr/foo/bar /tmp/
$ namei -lx /tmp/bar
f: /tmp/bar
Drwxr-xr-x root    root    /
Drwxrwxrwt root    root    tmp
lrwxrwxrwx muru    muru    bar -> /usr/foo/bar
Drwxr-xr-x root    root      /
drwxr-xr-x root    root      usr
                             foo - No such file or directory

대문자는 D장착 지점을 나타냅니다.

답변2

귀하와 같은 표준 경로 이름이 주어지면 다음과 같이 작동합니다.

set -f --; IFS=/
for p in $pathname
do    [ -e "$*/$p" ] || break
      set -- "$@" "$p"
done; printf %s\\n "$*"

완전히 존재하거나 연결 가능한 마지막 구성 요소를 인쇄 $pathname하고 각 구성 요소를 개별적으로 arg 배열에 배치합니다. 존재하지 않는 첫 번째 구성 요소는 인쇄되지 않지만 $p.

반대 접근 방식을 취할 수도 있습니다.

until cd -- "$path" && cd -
do    case   $path  in
      (*[!/]/*)
              path="${path%/*}"
;;    (*)   ! break
      esac
done  2>/dev/null   && cd -

$path이 금액은 적절하게 반환되거나 필요에 따라 축소됩니다. 변경 시도를 거부 /하지만 성공하면 현재 작업 디렉터리와 변경된 디렉터리를 stdout으로 인쇄합니다. 귀하의 전류 $PWD도 여기에 공급됩니다 $OLDPWD.

답변3

다음과 같습니다(공백이 포함된 경로 이름을 생각해 보세요).

#!/bin/sh
explain() {
    if [ -d "$1" ]
    then
        printf "\t%s: is a directory\n" "$1"
    elif [ -e "$1" ]
    then
        printf "\t%s: is not a directory\n" "$1"
    else
        printf "\t%s: does not exist\n" "$1"
    fi
}

for item in "$@"
do
    last=
    test="$item"
    printf "testing: '%s'\n" "$item"
    while [ ! -d "$test" ]
    do
        last="$test"
        test=$(dirname "$test")
        [ -z "$test" ] && break
    done
    if [ -n "$last" ]
    then
        explain "$test"
        explain "$last"
    else
        printf "\t%s: ok\n" "$item"
    fi
done

답변4

(( dirct=$(echo ${dir}|tr "/" " "|wc -w)+1 ))
i=2
while [ ${i} -le ${dirct} ]
do
  sdir=$(echo ${dir}|cut -d/ -f1,${i})
  if [ ! -d ${sdir} ]
  then
    echo "Path is broken at ${sdir}"
  fi
  (( i++ ))
done

간단하지는 않지만 자주 사용할 예정이라면 스크립트에 넣어서 실행 가능하게 만들고 경로 어딘가에 붙여넣으면 됩니다.

주의 사항: 모든 수준의 디렉터리 이름에 문자가 포함되어 있으면 작동하지 않습니다 space.

관련 정보