심볼릭 링크로 가득 찬 폴더에서 가장 긴 폴더 이름이 포함된 심볼릭 링크를 찾아야 합니다. 지금까지 나는 이것을 가지고 있습니다 :
find <folder> -type l -printf "%l\n"
다음 의사 코드처럼 검색하는 동안 폴더 이름을 저장할 수 있는 방법이 있는지 궁금합니다.
if [length > max]
{
max = length
var = link
}
감사해요:)
답변1
find /path/to/base -type l | awk -F/ 'BEGIN {maxlength = 0; longest = "" } length( $NF ) > maxlength { maxlength = length( $NF ); longest = $NF } END { print "longest was", longest, "at", maxlength, "characters." }'
콘텐츠를 awk
더 읽기 쉽게 만들려면 다음을 수행하세요.
BEGIN {
maxlength = 0
longest = ""
}
length( $NF ) > maxlength {
maxlength = length( $NF )
longest = $NF
}
END {
print "longest was", longest, "at", maxlength, "characters."
}
awk
구분된 데이터를 처리하는 데 매우 능숙합니다. 경로는 s 로 구분되므로 /
이를 필드 구분 기호(스위치 사용)로 사용하여 변수에 표시되는 가장 긴 이름 과 변수의 길이를 -F
추적합니다 . 링크가 발견되지 않으면 독자가 올바른 출력을 유지할 수 있도록 약간의 주의와 피드백을 연습으로 남겨 두겠습니다.longest
maxlength
답변2
그리고 zsh
:
zmodload zsh/stat
by_link_depth() {
zstat -A REPLY +link -- ${1-$REPLY}
REPLY=${REPLY//[^\/]}
}
전역 변수에 대한 정렬 방법으로 사용할 수 있는 심볼릭 링크 대상에서 슬래시를 반환하는 함수를 정의합니다.
ls -ld -- **/*(D@O+by_link_depth[1])
가장 깊은 대상이 있는 숨겨진 심볼릭 링크( )를 포함하여 심볼릭 링크( @
)가 나열됩니다 ( 링크 깊이에 따라 역순으로 정렬되고 첫 번째 항목이 선택됨).D
O+by_link_depth
[1]
여기 /usr/bin
:
$ ls -ld -- **/*(D@O+by_link_depth[1])
lrwxrwxrwx 1 root root 59 Oct 9 03:08 mptopdf -> ../share/texlive/texmf-dist/scripts/context/perl/mptopdf.pl
$ ls -lUd -- **/*(D@O+by_link_depth[1,3])
lrwxrwxrwx 1 root root 59 Oct 9 03:08 mptopdf -> ../share/texlive/texmf-dist/scripts/context/perl/mptopdf.pl*
lrwxrwxrwx 1 root root 61 Oct 9 03:09 pkfix-helper -> ../share/texlive/texmf-dist/scripts/pkfix-helper/pkfix-helper*
lrwxrwxrwx 1 root root 60 Oct 9 03:09 mkjobtexmf -> ../share/texlive/texmf-dist/scripts/mkjobtexmf/mkjobtexmf.pl*
zstat +link
최대 딥링크 대상에만 관심이 있고 이를 가리키는 심볼릭 링크에는 관심이 없는 경우 대신 해당 심볼릭 링크에서 실행 하거나 and 함수를 ls -ld
정의할 수 있습니다 .resolve
by_depth
resolve() zstat -A REPLY +link -- ${1-$REPLY}
by_depth() REPLY=${REPLY//[^\/]}
그리고:
printf '%s\n' **/*(D@O+by_depth+resolve[1])
+resolve
심볼릭 링크를 전역 확장 대상으로 변환 하고 O+by_depth
깊이별로 역순으로 정렬합니다.
bash
(아래 코드는 결코 bash
구체적이지 않지만) 및 GNU 유틸리티(귀하의 유틸리티 는 이미 GNU에 특화되어 있음) 를 사용하면 -printf
비슷한 결과를 얻을 수 있습니다.
find . -type l -printf '%l\0%p\0' | gawk -v RS='\0' -v ORS='\0' -F / '
{n = NF; getline; if (n > max) {max = n; file = $0}}
END {if (max) print file}' | xargs -r0 ls -ld
또는 가장 깊은 대상의 경우:
find . -type l -printf '%l\0' | gawk -v RS='\0' -F / '
NF > max {max = NF; target = $0}
END {if (max) print target}'