`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_COLORS이 ls있지만 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.