디렉토리에 있는 모든 심볼릭 링크 파일의 원시 파일을 인쇄하는 방법은 무엇입니까?

디렉토리에 있는 모든 심볼릭 링크 파일의 원시 파일을 인쇄하는 방법은 무엇입니까?

심볼릭 링크 파일만 포함된 디렉토리가 있습니다.

해당 디렉토리에서 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원래 명령이 작동할 수 있습니다 . 그러나 와일드카드는 이미 이를 처리하므로 더 안전한 솔루션입니다.

관련 정보