존재하지 않는 경로가 있다고 가정해 보세요.
$ 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
.