가장 긴 파일 이름 찾기

가장 긴 파일 이름 찾기

심볼릭 링크로 가득 찬 폴더에서 가장 긴 폴더 이름이 포함된 심볼릭 링크를 찾아야 합니다. 지금까지 나는 이것을 가지고 있습니다 :

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추적합니다 . 링크가 발견되지 않으면 독자가 올바른 출력을 유지할 수 있도록 약간의 주의와 피드백을 연습으로 남겨 두겠습니다.longestmaxlength

답변2

그리고 zsh:

zmodload zsh/stat
by_link_depth() {
  zstat -A REPLY +link -- ${1-$REPLY}
  REPLY=${REPLY//[^\/]}
}

전역 변수에 대한 정렬 방법으로 사용할 수 있는 심볼릭 링크 대상에서 슬래시를 반환하는 함수를 정의합니다.

ls -ld -- **/*(D@O+by_link_depth[1])

가장 깊은 대상이 있는 숨겨진 심볼릭 링크( )를 포함하여 심볼릭 링크( @)가 나열됩니다 ( 링크 깊이에 따라 역순으로 정렬되고 첫 번째 항목이 선택됨).DO+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정의할 수 있습니다 .resolveby_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}'

관련 정보