심볼릭 링크 파일만 포함된 디렉토리가 있습니다.
해당 디렉토리에서 ls 명령을 전달하고 이를 readlink 명령의 요소로 사용하여 원본 파일을 인쇄하고 싶습니다.
다음 명령을 시도했지만 답을 찾을 수 없습니다
$ ls opt/integrity/ | xargs readlink
디렉토리에 있는 모든 파일에 대해 ls 및 readlink 명령을 통해 원시 파일을 출력하는 적절한 명령을 아는 사람이 있습니까?
답변1
심볼릭 링크와 그것이 가리키는 대상 경로를 나열하려면 다음을 사용하십시오 zsh
.
$ zmodload zsh/stat
$ stat -n +link /dev/*(@)
/dev/cdrom sr0
/dev/core /proc/kcore
/dev/fd /proc/self/fd
/dev/initctl /run/initctl
/dev/log /run/systemd/journal/dev-log
/dev/rtc rtc0
/dev/stderr /proc/self/fd/2
/dev/stdin /proc/self/fd/0
/dev/stdout /proc/self/fd/1
ast-open을 구현하면 ls
다음과 같은 작업도 수행할 수 있습니다.
$ ls -d --format='%(name)s %(linkpath)s' /dev/*(@)
/dev/cdrom sr0
/dev/core /proc/kcore
/dev/fd
/dev/initctl /run/initctl
/dev/log /run/systemd/journal/dev-log
/dev/rtc rtc0
/dev/stderr /proc/self/fd/2
/dev/stdin /proc/self/fd/0
/dev/stdout /proc/self/fd/1
GNU 사용 find
:
$ find /dev/ -maxdepth 1 -type l -printf '%p %l\n'
/dev/cdrom sr0
/dev/rtc rtc0
/dev/log /run/systemd/journal/dev-log
/dev/initctl /run/initctl
/dev/core /proc/kcore
/dev/stderr /proc/self/fd/2
/dev/stdout /proc/self/fd/1
/dev/stdin /proc/self/fd/0
/dev/fd /proc/self/fd
(숨겨진 파일이 있는 경우 포함하여 정렬되지 않았습니다.
GNU 사용 stat
:
$ command stat -c %N /dev/*(@)
'/dev/cdrom' -> 'sr0'
'/dev/core' -> '/proc/kcore'
'/dev/fd' -> '/proc/self/fd'
'/dev/initctl' -> '/run/initctl'
'/dev/log' -> '/run/systemd/journal/dev-log'
'/dev/rtc' -> 'rtc0'
'/dev/stderr' -> '/proc/self/fd/2'
'/dev/stdin' -> '/proc/self/fd/0'
'/dev/stdout' -> '/proc/self/fd/1'
path/to/*(@)
숨겨지지 않은 파일 형식으로 확장됩니다.심볼릭 링크path/to
디렉터리 에서는 @
glob 한정자를 사용합니다. 이 기능은 zsh
구체적입니다. 다른 셸에서는 일반적으로 find
해당 유형에 따라 파일을 선택 해야 합니다 .
예를 들어 bash 4.4+ 및 GNU 시스템에서 해당 확장은 다음과 같습니다 /dev/*(@)
.
readarray -td '' files < <(
LC_ALL=C find /dev/ -mindepth 1 -maxdepth 1 ! -name '.*' -type l -print0 |
sort -z
)
if (( ${#files[@]} )); then
stat -c %N -- "${files[@]}"
else
echo>&2 No match.
fi
답변2
ls
파일 목록을 표시하는 데 사용할 필요가 전혀 없습니다 readlink
(그 목적은 기계가 아닌 사람에게 편리한 파일 목록을 제공하는 것입니다). 대신 *
디렉토리의 모든 파일과 일치하도록 쉘을 확장할 수 있습니다.
readlink opt/integrity/*
경로가 존재하고 소스 파일 이름에 공백(또는 기타 "특수" 문자)이 포함되어 있지 않으면 opt/integrity
원래 명령이 작동할 수 있습니다 . 그러나 와일드카드는 이미 이를 처리하므로 더 안전한 솔루션입니다.