디렉토리의 총 하드 링크 수를 계산하는 방법은 무엇입니까?

디렉토리의 총 하드 링크 수를 계산하는 방법은 무엇입니까?

나는 -ls 및 find 명령을 사용하여 디렉토리의 하드 링크 발생 횟수를 계산하려고 했습니다.

ls -li 명령을 사용하여 2보다 큰 모든 링크 수를 물리적으로 계산하는 것 외에 이를 수행하는 쉬운 방법이 있습니까?

답변1

그리고 zsh:

(){echo $#} *(NDl+1)

.카운트 되지 않으니 주의하시기 바랍니다 ...

디렉토리(대부분의 파일 시스템에서는 항상 하드 링크)를 계산하지 않으려면 로 변경하십시오 *(NDl+1^/).

  • (){echo $#}인수의 수를 출력하는 익명 함수
  • *(...)glob 한정자가 있는 glob
  • N: nullglob이 glob을 활성화합니다(일치하는 항목이 없으면 비어 있도록 확장됩니다).
  • D: dotglob이 glob을 활성화합니다(숨겨진 파일은 포함하지만 .또는 는 포함하지 않음 ..).
  • l+1: 링크 번호가 1보다 큰 파일을 선택합니다.
  • ^/: 파일 형식 제외목차.

POSIX에 해당:

find .//. ! -name . -prune -links +1 | grep -c //

( 제외 디렉터리 ! -type d에 추가됨 -prune)

또는 다음을 사용하여 ls:

(export LC_ALL=C; ls -Aqn | awk 'NR > 1 && $2 > 1 {n++}; END {print n}')

디렉터리를 제외하려면 && $1 !~ /^d/뒤에 추가하세요 $2 > 1.

답변2

ls -qAi | awk '{print $1}' | sort | uniq -d | wc -l

중복 인덱스 노드 수 계산현재 디렉터리에(각각 하나씩, 모든 항목을 계산하기 위해 -d로 대체 -D), 다른 모든 링크가 현재 디렉토리 외부에 있는 하드 링크는 계산되지 않습니다. .그리고 ..제외되었습니다. 교체는 이를 다시 -A추가합니다 -a(비록 현재 디렉토리에 하드 링크가 있을 가능성은 낮지만).

더 짧은 방법이 있을 수 있지만 이는 매우 예시적입니다.

Mr. Pipe는 |당신의 친구입니다.

( man또한)

재미있게 보내세요!

답변3

Linux 환경에서는 stat파일별로 명령어를 사용하여 링크 개수를 물어볼 수 있습니다. 를 사용하여 도트 파일을 카운트에 포함할지 아니면 카운트에서 제외할지 결정할 수 있습니다 shopt -s dotglob. 아래 루프에서는 일부러 디렉토리를 건너뛰었습니다.

shopt -s dotglob
i=0
for f in ./*
do
  [ -d "$f" ] && continue
  if [ $(stat -c %h "$f") -gt 1 ]
  then
    i=$((i+1))
  fi
done

또는 GNU 찾기를 사용하세요:

find . -maxdepth 1 \! -type d -links +1 -printf . | wc -c

이를 위해서는 find현재 디렉터리( )에서 검색을 시작 해야 합니다 ..

  • 오직현재 디렉터리( -maxdepth 1)
  • 디렉터리 건너뛰기( 셸에서 이스케이프 ! -type d된 디렉터리)!
  • 링크 수가 1보다 큰 경우
  • 이 경우 인쇄기간( .)
  • ...그리고 방출된 주기 수를 계산합니다.

답변4

다음 한 줄의 코드를 사용하여 하드 링크 수가 가장 많은 파일을 찾습니다.

find . -type f -exec ls -l {} \; | sort -nrk 2 | head -n 1

같은 내용을 찾는 다른 분들께 도움이 되길 바랍니다.

관련 정보