주어진 파일 시스템에서 모든 하드 링크 된 파일을 찾아야합니다. 예를 들어 파일 목록을 얻으십시오. 각 줄에는 연결된 쌍 또는 삼중 등이 포함됩니다.
파일 시스템의 모든 파일 / 디렉토리에 대해 inode로 키가 지정된 사전을 작성하고 “.”을 제외시키는 방법을 다소 이해하고 있습니다. “..”링크, 그리고 둘 이상의 이름을 가진 indodes는 하드 링크입니다 …하지만 기성품 해결책이 있거나 누군가가 이미 그러한 스크립트를 작성했으면합니다.
답변
다음 명령을 실행할 수 있습니다.
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 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와 관련된 모든 파일을 표시하는 등 더 나은 솔루션이 있기를 진심으로 바랍니다 .
답변
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