소스 파일과 대상 링크 파일만 표시하려면 "ls"를 사용하십시오.

소스 파일과 대상 링크 파일만 표시하려면 "ls"를 사용하십시오.

다음을 사용하여 링크가 가리키는 대상 파일을 표시할 수 있습니다 ls -l.

snowch$ ls -l /usr/local/bin/mvn
lrwxr-xr-x  1 snowch  admin  29 12 Dec 08:58 /usr/local/bin/mvn -> ../Cellar/maven/3.2.3/bin/mvn

다른 명령(예: awk)을 통해 파이프하지 않고 더 적은 출력을 표시하는 방법이 있습니까? 예를 들어:

snowch$ ls ?? /usr/local/bin/mvn
/usr/local/bin/mvn -> ../Cellar/maven/3.2.3/bin/mvn

저는 OS X 10.9.5에서 3.2.53을 실행하고 있습니다. 여러 명령의 출력은 다음과 같습니다.

snowch$ ls -H /usr/local/bin/mvn
/usr/local/bin/mvn

snowch$ ls -L /usr/local/bin/mvn
/usr/local/bin/mvn

snowch$ file /usr/local/bin/mvn
/usr/local/bin/mvn: POSIX shell script text executable

snowch$ file -b /usr/local/bin/mvn
POSIX shell script text executable

답변1

ls불행하게도 파일 속성을 검색하여 임의의 방식으로 표시할 수 있는 옵션은 없습니다. 일부 시스템에는 이를 위한 별도의 명령이 있습니다(예: GNU stat에는 GNU에 명령이나 기능이 있습니다 find).

대부분의 최신 시스템과 대부분의 파일에서는 다음과 같이 작동합니다.

$ ln -s '/foo/bar -> baz' the-file
$ LC_ALL=C ls -ldn the-file | sed '
   1s/^\([^[:blank:]]\{1,\}[[:blank:]]\{1,\}\)\{8\}//'
the-file -> /foo/bar -> baz

이는 출력의 첫 번째 줄에서 공백으로 구분된 처음 8개 필드를 제거하는 방식으로 작동합니다 ls -l. gid가 시스템에 표시되지 않거나 많은 수의 링크가 있는 경우 처음 두 필드가 함께 연결되지 않는 한 이는 작동합니다.

GNU 사용 stat:

$ LC_ALL=C stat -c '%N' the-file
'the-file' -> '/foo/bar -> baz'

GNU 사용 find:

$ find the-file -prune \( -type l -printf '%p -> %l\n' -o -printf '%p\n' \)
the-file -> /foo/bar -> baz

FreeBSD/OS/X 통계의 경우:

f=the-file
if [ -L "$f" ]; then
  stat -f "%N -> %Y" -- "$f"
else
  printf '%s\n' "$f"
fi

통계 zsh:

zmodload zsh/stat
f=the-file
zstat -LH s -- "$f"
printf '%s\n' ${s[link]:-$f}

많은 시스템에는 readlink링크 대상을 얻기 위한 특정 명령도 있습니다.

f=the-file
if [ -L "$f" ]; then
  printf '%s -> ' "$f"
  readlink -- "$f"
else
  printf '%s\n' "$f"
fi

답변2

file명령을 사용하십시오 .

[sreeraj@server ~]$ ls -l mytest
lrwxrwxrwx 1 sreeraj sreeraj 15 Dec 12 09:31 mytest -> /usr/sbin/httpd

[sreeraj@server ~]$ file mytest
mytest: symbolic link to `/usr/sbin/httpd'

또는

[sreeraj@server ~]$ file -b mytest
symbolic link to `/usr/sbin/httpd'
[sreeraj@server ~]$

또한 매뉴얼 페이지를 읽고 ls옵션이 요구 사항을 충족하는지 -L확인 하십시오.-H

답변3

ls적어도 GNU는 있다(물론 tcsh구현은 있습니다)환경 변수를 수정 $LS_COLORS하여 원하는 곳에 구분 기호를 삽입 할 수 있습니다.(그러나 tcsh내장된 함수는 ls-F링크 대상을 실행하지 않습니다.링크 플래그)일반적으로 ls인쇄할 수 없는 임의의 터미널 이스케이프는 이 환경 변수에 저장된 값을 기반으로 삽입되지만 임의의 다른 콘텐츠를 삽입하는 것을 막을 수는 없습니다. 이것에 대해 더 자세히여기.

예를 들어:

LS_COLORS='ln=///\n:lc=:no=//:rc=:rs=:' \
\ls ~ -l --color=always | 
sed '\|///|,\|//|!d;//d'

//이렇게 하면 각 목록의 시작 부분에 문자열이 배치됩니다.(그래서 직전에 lrwcrwx)///\n링크된 파일 이름 앞에 . sed그런 다음 행 범위를 필터링합니다. d입력 행이 발견될 때까지 모든 입력 행을 삭제하고 ///거기에서 일치하는 다음 행까지 //일치하는 행을 삭제 합니다 //. 따라서 사이의 문자에 관계없이 링크 이름과 링크 대상만 가져옵니다. /이는 파일 이름에 나타날 수 없고 인쇄될 수 있는 경로에 있는 파일 이름은 ls개별적으로만 나타나기 때문입니다 .

바라보다?

mkdir test; cd test
touch 'long


name' shortname
ln -s l* "$(printf %s.ln l*)"; ln -s s* shortname.ln

LS_COLORS='ln=///\n:lc=:no=//:rc=:rs=:' \
\ls  -l --color=always | sed '\|///|,\|//|!d;//d'

...인쇄:

long


name.ln -> long


name
shortname.ln -> shortname

직접 시도해 보세요.

답변4

[리눅스/배시]

나는 이렇게 할 것이다:

ls -l | sed -e"s/ \+/ /g" | cut -d' ' -f 9-

sed명령은 여러 공백을 단일 공백으로 축소하고 cut필드 구분 기호가 공백인 9번째 필드를 추출합니다.

일반적인 출력:

libboost_atomic.a
libboost_atomic.so -> libboost_atomic.so.1.57.0
libboost_atomic.so.1.57.0
...
libboost_wserialization.a
libboost_wserialization.so -> libboost_wserialization.so.1.57.0
libboost_wserialization.so.1.57.0

대안은 다음과 같습니다:

ls -l | awk '{ print $9, $10, $11 }'
ls -l | awk '{ $1 = $2 = $3 = $4 = $5 = $6 = $7 = $8 = "" ; print }'

그러나 이는 불완전합니다. 첫 번째는 후행 공백을 출력할 수 있고 두 번째는 선행 공백을 출력할 수 있습니다.

관련 정보