symlink 대상별로 파일 나열 이름을 통해 필터링하여 파일

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


답변

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.