symlink 대상별로 파일 나열


23

심볼릭 링크 이름이 아닌 심볼릭 링크 대상 이름을 통해 필터링하여 파일 목록을 가져온 다음 해당 목록으로 무언가를 수행하는 방법은 무엇 입니까? 예를 들어 다음 목록에서 처음 네 파일에만 관심이 있습니다 (target contains bar).

foo ->  /tmp/bar
bar ->  /home/me/bartoo
baz ->  /home/me/public/barthree
zoo ->  /usr/share/bar
moo ->  /tmp/foo
roc ->  /tmp/roc

답변:


31

find를 사용하여 symlink 유형의 모든 파일을 가져오고 -ilname링크 대상 이름으로 검색 하는 옵션을 추가 할 수 있습니다. 이것은 -iname링크 이름 대신 링크 대상 이름 과 동일하게 작동합니다 .

find -type l -ilname "*bar*"

그래도 대상이 아닌 링크 이름이 인쇄됩니다. 대상 이름을 인쇄하려면 다음을 시도하십시오.

find -type l -ilname "*bar*" -printf "%l\n"

또는 풀 ls스타일 출력을 얻으십시오

find -type l -ilname "*bar*" -ls

" 목록으로 작업 수행 "의 의미 는 확실하지 않지만 링크 파일을 조작하려면 -exec인수를 사용하여 다음 을 찾을 수 있습니다.

find -type l -ilname "*bar*" -exec touch {} \;

그러나 링크 대상에서 작업해야하는 -printf경우 대상 값을 가져 오려면 또는를 사용하여 xargs루프를 실행해야합니다. 다음과 같이 할 수 있습니다.

find -type l -printf "%l\n" | grep bar | xargs touch

...이 방법 은 이름 일치를 수행 하는 grep대신 사용하는 방법을 보여줍니다 find -ilname.


Caleb 감사합니다! 당신은 내 즉각적인 질문에 완전히 대답하고 내가 확실히 사용할 사이드 채널 사례를 다루었습니다.
매트 윌키

1
왜 이것이 find /dev/disk/ -type l -ilname "*sde*"작동 하지 않는지 아십니까?
물병 자리 힘

GNU 찾기가 필요합니다.
sep
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.