다음을 사용하여 링크가 가리키는 대상 파일을 표시할 수 있습니다 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 }'
그러나 이는 불완전합니다. 첫 번째는 후행 공백을 출력할 수 있고 두 번째는 선행 공백을 출력할 수 있습니다.