파일 시스템에서 모든 하드 링크 된 파일을 어떻게 찾을 수 있습니까?


21

주어진 파일 시스템에서 모든 하드 링크 된 파일을 찾아야합니다. 예를 들어 파일 목록을 얻으십시오. 각 줄에는 연결된 쌍 또는 삼중 등이 포함됩니다.

파일 시스템의 모든 파일 / 디렉토리에 대해 inode로 키가 지정된 사전을 작성하고 "."을 제외시키는 방법을 다소 이해하고 있습니다. ".."링크, 그리고 둘 이상의 이름을 가진 indodes는 하드 링크입니다 ...하지만 기성품 해결책이 있거나 누군가가 이미 그러한 스크립트를 작성했으면합니다.

답변:


17

다음 명령을 실행할 수 있습니다.

find / -type f -printf '%n %p\n' | awk '$1 > 1{$1="";print}'

하드 링크 된 파일을 모두 찾습니다.

또는 @mbafford 버전 :

find / -type f -links +1 -printf '%i %n %p\n'

1
고마워, 이것은 내가 원하는 것이 아니지만 충분히 가깝습니다. '% i'를 추가하여 inode 번호를 인쇄 한 다음 정렬 / 그룹화 할 수 있습니다.
haimg

15
find의 "-links + n '구문을 사용하여 awk가 필요하지 않도록 할 수 있습니다. 예를 들어 두 개 이상의 링크가있는 모든 파일을 찾아 필요한 정보를 인쇄하려면 다음과 같이하십시오.find / -type f -links +1 -printf '%i %n %p\n'
mbafford

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 %pinode 수를 계산하기 위해 실제 파일 을 포함시켜야합니다 .
Northern-bradley

17
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와 관련된 모든 파일을 표시하는 등 더 나은 솔루션이 있기를 진심으로 바랍니다 .


1
아야! 이렇게하면 하드 링크 된 각 파일에 대해 파일 시스템을 반복해서 검색합니다.
haimg

1
나는 그것이 빠르다고 주장하지 않았으며 작은 디렉토리 트리에 대해서는 일종의 작동 방식입니다. 물론, 예를 들어의 출력으로 구축 할 수있는 적절한 색인 find . -type f -printf '%i %p\n'을 사용하면 훨씬 빠른 솔루션을 구축 할 수 있습니다.
Claudius

그리고 그것은 경로 AFAIK의 공간을 처리하지 않습니다.
Gilles Quenot 16:10에

를 들어 for루프, 조정 IFS 그에 따라 작동합니다. 내 의견에서 find 명령의 출력을 구문 분석하려면 첫 번째 공백과 줄 끝 사이의 모든 것을 파일 이름으로 선언하면 작동해야합니다.
Claudius

1
@Sati : 오류 메시지를 버립니다 (예 : 액세스 할 수없는 폴더 lost+found등). 출력이 두 번째 줄에서와 같이 추가로 처리되어야하는 경우 특히 중요합니다.
DJCrashdummy

1

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
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.