하드 링크는 어떻게 삭제합니까?


23

최근에 다음과 같은 링크를 만들었습니다.

sudo ln -n originalFileLocation

하드 링크는 어떻게 삭제합니까?


4
참고로 : 현재 디렉토리에 ln -n /path/to/file이름이 지정된 파일을 작성하고 file약칭입니다 ln --no-dereference /path/to/file. 즉 /path/to/file, 심볼릭 링크 인 경우 새로 만든 하드 링크는 심볼릭 링크의 대상 대신 해당 심볼릭 링크를 가리 킵니다.
Lekensteyn의

답변:


37

rm평소 와 같이 삭제할 수 있습니다 rm NameOfFile.. 하드 링크의 경우 "원본 파일"과 "파일에 대한 링크"사이에는 차이가 없습니다. 동일한 파일에 대해 두 개의 이름 만 있고 이름 중 하나만 삭제해도 다른 파일은 삭제되지 않습니다.


2
또한 sudo제공 한 명령 (수퍼 유저)으로 생성 한 경우 루트로 사용 ( )해야합니다.
Rafał Cieślak

3
@ RafałCieślak : 잘못되었습니다. inode에 대한 모든 하드 링크는 inode와 동일한 액세스 권한을 공유합니다. 파일의 디렉토리 항목을 삭제 (즉, "링크 해제")하려면 해당 파일의 inode 및 삭제하려는 항목이 포함 된 디렉토리에 대한 쓰기 권한이 필요합니다. 따라서 하드 링크를 만드는 데 사용 된 권한은 관련이 없습니다. 그것들은 창조 당시와 똑같을 수도 있습니다.
David Foerster

2

중복 하드 링크를 제거하는이 스크립트가 있습니다. 그러나 조심하십시오-그것은 매우 위험합니다.

#!/bin/bash
clear
echo Reduce redundant hardlinks in the current folder
echo ------------------------------------------------
echo 
echo "  $(basename $0) [-R]"
echo "      -R means recursive"
echo 
read -p "You can break by pressing Ctrl+C"
echo
ask=1
if [ a$1 == "a-R" ]; then  recursive=" -R "; fi

for i in $(ls -i $recursive | awk '{print $1}' | uniq --repeated | sort); 
do 
    echo "Inode with multiple hardlinked files: $i"
    first=1
    for foundfile in $(find . -xdev -inum $i);
    do 
        if [ $first == 1 ]; then
            echo "  preserving the first file:  $foundfile"
            first=0
        else
            echo "  deleting the redundant file:    $foundfile"  
            #rm $foundfile  
        fi
    done 
    if [ $ask == 1 ]; then 
        read -p "Delete all the rest of redundant hardlinks without asking? y/N "
        if [ a${REPLY,,} == "ay" ]; then  ask=0; fi
    fi  
#   read -p "pause for sure"
    echo
done
echo "All redundant hardlins are removed."
echo

1

실제로 rm작동하지 않습니다.

[user@localhost Products]$ rm AZP/
rm: cannot remove `AZP/': Is a directory
[user@localhost Products]$ rm -r AZP/
rm: cannot remove `AZP': Not a directory

작동하는 것은 unlink AZP입니다.


2
당신은 하드 링크였습니까? 하드 링크는 파일 iirc와 같습니다.
Seth

@ Seth, 실제로 나는 그것이 무엇인지 기억하지 못하지만, 당신이 볼 수있는 것처럼 제거하고 싶지 않습니다. 누군가 나에게 연결 해제를 사용하라고 말했고 작동했습니다. :)
Bunyk

AZP는 디렉토리가 아닌 파일이기 때문에 더 많은 정보가 없으면 확신 할 수 없었습니다. 연결 해제는 항상 작동해야하므로 아무런 문제가 없습니다.
Seth

1
AZP/디렉토리처럼 보이지만, rm은 재귀 플래그가없는 디렉토리에서는 작동하지 않습니다. 또한 coreutills 문서에 따르면. >>> 대부분의 시스템은 디렉토리에 대한 하드 링크를 만드는 것을 금지합니다. 허용되는 경우에는 수퍼 유저 만 그렇게 할 수 있습니다 (사이클을 만들면 다른 많은 유틸리티에 문제가 발생할 수 있으므로주의해야합니다).
ThorSummoner

2
디렉토리에 대한 하드 링크는 금지되어 있습니다. If AZP는 디렉토리 (또는 다른 rm AZP/것 때문에)를 rm생각 하기 때문에 디렉토리 (또는 다른 것)에 대한 심볼릭 링크가 작동하지 않습니다 /. 그러나 rm AZP잘 작동합니다. -1
David Foerster

0

링크 만 제거하여 원본 파일을 유지하려면 링크 해제를 사용해야합니다.


무엇을 읽었 unlink(1)습니까? 디렉토리가 아닌 모든 파일에 사용 unlink(2)되는 것과 동일한 시스템 호출 인 시스템 호출 주위의 얕은 래퍼 rm(1)입니다.
David Foerster

1
이 답변은 잘못된 것입니다. 하드 링크 된 파일을 사용하면 "링크"와 "원본 파일"이 구분되지 않습니다. 모든 하드 링크는 다른 디렉토리 항목으로 표시되는 동일한 파일 / 콘텐츠 / 노이드를 나타냅니다. unlink이름에도 불구하고, 하드 링크 된 파일을 두 개의 개별 파일로 분리하지는 않지만 "링크되지 않은"디렉토리 항목을 제거합니다 (단, 링크 수가 1보다 크면 파일 / 콘텐츠 / 노드는 제외).
머피
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.