나는 -ls 및 find 명령을 사용하여 디렉토리의 하드 링크 발생 횟수를 계산하려고 했습니다.
ls -li 명령을 사용하여 2보다 큰 모든 링크 수를 물리적으로 계산하는 것 외에 이를 수행하는 쉬운 방법이 있습니까?
답변1
그리고 zsh
:
(){echo $#} *(NDl+1)
.
카운트 되지 않으니 주의하시기 바랍니다 ..
.
디렉토리(대부분의 파일 시스템에서는 항상 하드 링크)를 계산하지 않으려면 로 변경하십시오 *(NDl+1^/)
.
(){echo $#}
인수의 수를 출력하는 익명 함수*(...)
glob 한정자가 있는 globN
: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
같은 내용을 찾는 다른 분들께 도움이 되길 바랍니다.