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

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

저는 우분투를 사용하고 있으며 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여러 개의 하드 링크 find( )가 있는 파일만 선택함을 나타냅니다.-type f

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

답변3

Unix/Linux/MacOS에서 디렉토리의 파일 이름은 디스크의 구조인 inode(간접 노드)를 나타냅니다.진짜파일입니다. 이러한 이름과 인덱스 노드의 연관을 호출합니다.하드 링크그리고소프트 링크이는 본질적으로 파일을 찾을 수 있는 이름이 포함된 파일입니다. 링크하려는 파일에 대한 경로의 일부를 삭제하거나 이름을 바꾸면 소프트 링크가 깨질 수 있지만, 하나의 하드 링크 이름을 바꾸거나 이동해도 다른 링크에는 전혀 영향을 미치지 않습니다.

따라서 "원본 파일"은 존재하지 않으며,모두하드 링크는 정확히 동일한 상태를 갖습니다. inode는 파일을 참조하는 하드 링크 수를 기록합니다( ls -l이 숫자를 두 번째 필드로 표시합니다. 파일의 경우 일반적으로 1(단 하나의 링크)이고 디렉터리의 경우 일반적으로 2(상위 링크 및 " ."의 링크) 디렉터리 자체입니다. ; 하위 디렉터리가 있는 경우 각 하위 디렉터리는 ".."으로 상위 디렉터리를 참조하므로 개수가 증가합니다. 링크 수가 0에 도달하면 파일이 사용하는 공간이 회수됩니다.

관련 정보