`ls`를 사용하여 소스 파일과 대상 링크 파일 만 표시


11

링크를 사용하여 가리키는 대상 파일을 표시 할 수 있습니다 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

답변:


7

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가 표시되지 않거나 많은 수의 링크가있을 때 처음 2 개의 필드가 결합 된 시스템을 제외하고는 작동합니다.

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

stat -f "%N -> %Y" -- /usr/local/bin/mvn잘 작동했습니다. 감사!
Chris Snow

1
오래된 RHEL6 시스템에서 stat는 GNU coreutils 8.4이며 stat -c %N -- /usr/local/bin/mvn. 인용문을 제거하기 위해 이것을 파이프에 | perl -pe 's/['"'"'`]//g'
넣어야

@cfi tr -d \'\`로 충분합니다. RHEL 시스템 find에는보다 많은 제어 권한을 가진 GNU가 있습니다 .
Stéphane Chazelas

5

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 ~]$

또한,의 man 페이지를 읽어 이동하시기 바랍니다 ls및 옵션을 확인 -L하고 -H그 귀하의 요구 사항을 충분되는지 확인합니다.


시원하고 매일 새로운 것을 배우십시오.
rob

@ 스리-많은 감사합니다! ls옵션 을 시도 했지만하지 않았습니다 file. 불행히도, 어느 쪽도 효과가없는 것 같습니다 :(
Chris Snow

@SHC 죄송합니다 linux. 상자 에 있다고 가정합니다 . osx태그 중 하나로 추가 하십시오. 그것은 osx또한 사용자 의 관심을 끌 것입니다. 태그를 추가하기 위해 게시물을 수정했지만 수정 사항이 즉시 표시 될만큼 크레딧이 부족합니다.
Sree December

@Sree-걱정하지 마십시오. 혼란을 드려 죄송합니다. 어쨌든 리눅스 컴퓨터로 돌아 왔을 때 유용 할 것이므로 귀하의 답변을 상향 조정했습니다.
Chris Snow

아마도 osx에서 'readlink'유틸리티를 확인하십시오.
tonioc December

2

ls적어도 GNU (그리고 분명히 tcsh구현) 를 사용하면 $LS_COLORS환경 변수를 해킹하여 원하는 곳에 구분 기호를 삽입 할 수 있습니다 (그러나 tcsh내장 ls-F은 링크 대상 만 링크 플래그 만하지 않습니다 ) 일반적으로 ls인쇄 할 수없는 임의의 터미널 이스케이프를 삽입합니다 해당 환경 var에 저장된 값을 기반으로하지만 다른 임의의 것을 삽입하는 것을 막을 수는 없습니다. 여기 에 더 많은 .

예를 들면 다음과 같습니다.

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

직접 해보십시오.


그런 식으로 ls지원 LS_COLORS하는 최신 버전의 GNU 이외의 --color=always인수와 인수 뒤에 및 옵션을 알고 있습니까? GNU 시스템에서 왜 find또는 사용할 수있을 때 복잡한 것을 사용 stat하시겠습니까? 일부를 수행하면 아마 작동하지 않을 것입니다 ln -s /// some-file.
Stéphane Chazelas

@StephaneChezales – 이것은 적어도 bsd와 유사하게 작동해야 함을 나타냅니다 ls. 나는 몇 달 전에 어딘가에서 ls구문과 같은 termcap을 받아들이는 경향이 있다는 것을 기억 합니다. 그 점에 대한 좋은 지적 ln -s ///이지만 \0NUL도 잘 작동 -R합니다. 이유에 관해서는-사용하기 쉽습니다. 어떤 경우에는 find- 보다 쉬우 며 여기에서 주제보다 조금 더 많은 것처럼 보였습니다 find. 어쨌든 너무 많은 사람들이 그것을 고려하지 않기 때문에, 나는 생각 나게 할 때 언급합니다.
mikeserv

FreeBSD에 대한 매뉴얼 페이지 또는 거기 를 참조하십시오 . FreeBSD에서 테스트하고 싶다면 GhostBSD / mfsbsd와 같은 라이브 CD를 VM에서 사용할 수 있습니다.
Stéphane Chazelas

@ StéphaneChazelas-아니요, 테스트 할 필요가 없습니다 . 완전히 다른 동물 입니다. 관심이 있다면 gnu 소스 도이 답변의 링크에 연결되어 있습니다. 나는 그 다른 것을 어디서 읽었는지 궁금합니까? 그것을 지적 해 주셔서 대단히 감사합니다, 그것은 버려서 잘못된 가정이었습니다. ive는 답변을 편집했습니다.
mikeserv

최신 버전에는 일부 GNU 버전과 동일한 방식 을 지원 tcsh하는 ls-F내장 기능 LS_COLORSls있지만 ls -F옵션을 전달하면 호출 되므로 시스템의 lsGNU가 아닌 경우 여기에서 작동하지 않습니다 ls.
Stéphane Chazelas

-1

[리눅스 / 배쉬]

나는 이것을 할 것이다 :

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 }'

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


이 질문은 "... 다른 명령을 통해 파이프 할 필요없이 ..."
Jeff Schaller

@ JeffSchaller : 좋은 지적입니다. 동의한다. 그러나 이것은 제목 질문에 대한 답변을 원하는 사람에게 여전히 유용하기를 바랍니다 (설명에 세부 사항 없음).
Rhubbarb
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.