ハードリンクを削除するにはどうすればよいですか?


23

最近、次のリンクを作成しました:

sudo ln -n originalFileLocation

ハードリンクを削除するにはどうすればよいですか?


4
参考:現在のディレクトリにln -n /path/to/file名前の付いたファイルを作成します。つまり、シンボリックリンクの場合、新しく作成されたハードリンクは、シンボリックリンクのターゲットではなく、そのシンボリックリンクを指します。fileln --no-dereference /path/to/file/path/to/file
レーケンシュタイン

回答:


37

rm通常どおり削除できます:rm NameOfFile。ハードリンクでは、「元のファイル」と「ファイルへのリンク」に区別がないことに注意してください。同じファイルの名前は2つだけで、名前の1つだけを削除してももう1つは削除されません。


2
またsudo、(スーパーユーザーとして)指定したコマンドで作成した場合は、rootとしてrmする必要があります(使用)。
ラファウチエラク

3
@RafałCieślak:間違っています。iノードへのすべてのハードリンクは、iノードのアクセス許可と同じアクセス許可を共有します。ファイルのディレクトリエントリを削除、つまり「リンク解除」するには、そのファイルのiノードと、削除するエントリが含まれるディレクトリに対する書き込み権限が必要です。したがって、ハードリンクの作成にどの特権が使用されたかは関係ありません。彼らはたまたま(まだ)作成時と同じかもしれません。
デビッドフォースター

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に似ています。
セス14年

@Seth、実際はそれが何であったか覚えていないが、あなたが見ることができるように削除したくない。誰かがunlinkを使用するように私に言ったが、それは機能した。:)
Bunyk 14年

これはおそらく、AZPがディレクトリではなくファイルだったためですが、詳細な情報がないと確信が持てませんでした。ただし、リンク解除は常に機能するはずなので、問題はありません。
セス14年

1
AZP/ディレクトリのように見えますが、rmは再帰フラグなしでディレクトリを操作しません。また、coreutillsのドキュメントによると。>>>ほとんどのシステムでは、ディレクトリへのハードリンクを作成できません。許可されている場合は、スーパーユーザーのみが許可されます(サイクルを作成すると他の多くのユーティリティに問題が発生するため、注意が必要です)。
-ThorSummoner

2
ディレクトリへのハードリンクは禁止されています。if AZPがディレクトリ(または他の何か)へのシンボリックリンクであるため、ディレクトリと見なさrm AZP/れるため機能しませんrm/最後にあるため)。しかし、rm AZPうまく動作します。-1
デビッドフォースター

0

リンクのみを削除して元のファイルを保持する場合は、リンク解除を使用する必要があります。


何を読んでunlink(1)いますか?これは、ディレクトリではないすべてのファイルに使用unlink(2)する同じシステムコールのシステムコールの浅いラッパーrm(1)です。
デビッドフォースター

1
この答えは誤解を招くものです。ハードリンクされたファイルでは、「リンク」と「元のファイル」の間に区別はありません。すべてのハードリンクは、異なるディレクトリエントリで表される同じファイル/コンテンツ/ inodeを参照します。unlink、名前にもかかわらず、ハードリンクを2つの個別のファイルに分離せず、「リンクされていない」ディレクトリエントリを削除します(ただし、リンクカウントが1を超える限り、file / content / inodeは削除しません)。
マーフィー
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.