원본 파일을 잃지 않고 우분투에서 하드 링크를 제거하는 방법은 무엇입니까?

원본 파일을 잃지 않고 우분투에서 하드 링크를 제거하는 방법은 무엇입니까?

나는 우분투에 있고 dropbox. 문제는 내 사진 폴더에 하드 링크가 많아서 동기화에 문제가 있다는 것입니다.

사진을 잃지 않고 간단한 명령으로 어떻게 사진을 모두 제거할 수 있나요? 단일 파일에 대해 흐르는 명령을 찾았습니다.

find /home -xdev -samefile "filename" | xargs rm

하지만 모든 파일에 대해 이를 수행하는 방법을 모르겠습니다.

미리 감사드립니다

내 파일 시스템에 대한 정보:

Filesystem     Type      Size  Used Avail Use% Mounted on
udev           devtmpfs  7,7G     0  7,7G   0% /dev
tmpfs          tmpfs     1,6G  2,4M  1,6G   1% /run
/dev/nvme0n1p3 ext4      435G  203G  211G  50% /
tmpfs          tmpfs     7,7G  756M  7,0G  10% /dev/shm
tmpfs          tmpfs     5,0M  4,0K  5,0M   1% /run/lock

답변1

파일에 대한 하드 링크가 두 개 이상 있으면 파일을 제거할 수 있으며, 마지막 하드 링크가 제거되면 데이터도 제거됩니다. 링크 수는 stat -c '%h' {file}(*)로 검색할 수 있으므로 다음과 같이 하나 이상의 하드 링크가 있는 모든 파일을 지울 수 있습니다.

for file in *
do
   links=$(stat -c '%h' "$file")
   [[ -f "$file" ]] && [[ $links -gt 1 ]] && rm "$file" 
done

그들이 말했듯이,결국엔 하나뿐이겠지, 디렉토리 처리 순서, 알파벳 순서 등에 따라 생존자가 마지막으로 확인됩니다.

(*) 이는 의 출력에도 나타나지만 ls -l구문 분석하기가 더 어렵습니다...

답변2

제거할 수 있습니다."추가의"다음과 같은 모든 파일의 복사본:

find /home -xdev -type f -links +1 -delete

하지만 이러한 추가 복사본 중 일부는 외부 위치에 하드 링크되어 있을 수 있다는 점에 유의해야 합니다./home(그리고 누락된 것처럼 보일 수도 있습니다).

그만큼-links +1하드링크가 2개 이상 있는 find파일( )만 선택하라고 합니다 .-type f

(더 많은 작업을 통해) find각 파일의 inode 값을 인쇄하고 결과를 정렬하고 (를 사용하여 awk) 통해 제거할 파일 목록을 작성할 수 있지만 xargs그렇게 하면 특수 문자(공백 포함)가 있는 파일 이름에 문제가 발생할 수 있습니다. 하지만 이는 파일이 외부에 링크되어 있을 때 놀라움을 없애는 방법이 될 것입니다./home.

답변3

Unix/Linux/MacOS에서 디렉터리의 파일 이름은 inode(간접 노드)를 참조합니다.정말파일입니다. 이러한 이름과 inode의 연관을하드 링크반대로소프트 링크이는 본질적으로 파일을 찾을 수 있는 이름을 포함하는 파일일 뿐입니다. 링크된 파일 경로의 일부가 이름이 바뀌거나 제거되면 소프트 링크가 깨질 수 있지만, 하나의 하드 링크 이름을 바꾸거나 이동해도 다른 링크에는 전혀 영향을 미치지 않습니다.

따라서 "원본 파일"은 존재하지 않으며,모두하드 링크의 상태는 정확히 동일합니다. inode는 파일을 참조하는 하드 링크 수를 기록합니다( ls -l이 숫자를 두 번째 필드로 표시합니다. 일반적으로 파일의 경우 1(링크만 1개), 디렉토리의 경우 2(상위 링크는 상위 링크, '.')) 하위 디렉터리가 있는 경우 각 디렉터리는 '..'을 통해 해당 상위 디렉터리를 참조하므로 개수가 늘어납니다. 링크 수가 0이 되면 파일이 사용하는 공간이 회수됩니다.

관련 정보