답변:
다음 명령을 실행할 수 있습니다.
find / -type f -printf '%n %p\n' | awk '$1 > 1{$1="";print}'
하드 링크 된 파일을 모두 찾습니다.
또는 @mbafford 버전 :
find / -type f -links +1 -printf '%i %n %p\n'
find / -type f -links +1 -printf '%i %n %p\n'
sort
(+ uniq
)를 통한 배관은 어떻습니까? 궁금해서 메인 컴퓨터 (ssd와 함께 16GB i5-2500k)를 사용했습니다. 2187757 파일 ( find / -xdev -type f | wc
)을 사용하면 3820 파일 / 570 inode ( time sudo find / -xdev -type f -links +1 -printf "%i\n" | sort | uniq | wc
)를 반환 할 때 12 초가 걸립니다 . %n %p
inode 수를 계산하기 위해 실제 파일 을 포함시켜야합니다 .
find . -type f -links +1 2>/dev/null
하나 이상의 링크가있는 모든 파일, 즉 하드 링크가있는 파일의 목록을 제공합니다. 이 과정을 반복하는 것은 상대적으로 쉽습니다. 파일이 많지 않은 경우 해키 솔루션
for i in $(find . -type f -links +1 2>/dev/null); do find -samefile $i | awk '{printf "%s ", $1}'; printf "\n"; done | sort | uniq
그러나 첫 번째 find
호출에서 inode 번호를 인쇄 한 다음 find
의 -inum
옵션을 사용하여이 inode와 관련된 모든 파일을 표시하는 등 더 나은 솔루션이 있기를 진심으로 바랍니다 .
find . -type f -printf '%i %p\n'
을 사용하면 훨씬 빠른 솔루션을 구축 할 수 있습니다.
for
루프, 조정 IFS 그에 따라 작동합니다. 내 의견에서 find 명령의 출력을 구문 분석하려면 첫 번째 공백과 줄 끝 사이의 모든 것을 파일 이름으로 선언하면 작동해야합니다.
lost+found
등). 출력이 두 번째 줄에서와 같이 추가로 처리되어야하는 경우 특히 중요합니다.
IMHO의 가장 좋은 방법은 다음 줄을 사용하는 것입니다 ( /PATH/FOR/SEARCH/
검색하려는 항목으로 바꿔야 함).
find /PATH/FOR/SEARCH/ -xdev -printf '%i\t%n\t%p\n' | fgrep -f <(find . -xdev -printf '%i\n' | sort -n | uniq -d) | sort -n
이것은 파일 시스템을 한 번만 스캔하고, 하나 이상의 하드 링크가있는 파일의 inode, 하드 링크 수 및 경로를 보여주고 inode에 따라 정렬합니다.
읽을 수없는 폴더에 대한 오류 메시지가 표시되지 않으면 다음과 같이 줄을 확장하십시오.
find /PATH/FOR/SEARCH/ -xdev -printf '%i\t%n\t%p\n' 2> /dev/null | fgrep -f <(find . -xdev -printf '%i\n' 2> /dev/null | sort -n | uniq -d) | sort -n