Sabit bir bağlantıyı nasıl silerim?


23

Son zamanlarda aşağıdakileri içeren bir bağlantı oluşturdum:

sudo ln -n originalFileLocation

Sabit bir bağlantıyı nasıl silerim?


4
Bilginize: mevcut dizinde ln -n /path/to/filebir dosya oluşturur fileve kısaca ln --no-dereference /path/to/file. Bu, eğer /path/to/filesembolik bir link ise, yeni oluşturulan hardlink, linklink hedefi yerine bu linke işaret edecektir.
Lekensteyn

Yanıtlar:


37

Sen ile silebilirsiniz rmzamanki gibi: rm NameOfFile. Sabit bağlantılarda, "orijinal dosya" ile "dosyaya bağlantı" arasında bir ayrım olmadığını unutmayın: aynı dosya için yalnızca iki adınız vardır ve adlardan yalnızca birini silmek diğerini silmez.


2
Ayrıca sudo, sağladığınız komutla (süper kullanıcı olarak) oluşturduysanız, root olarak kullanmanız (kullanmanız ) gerekir.
Rafał Cieślak

3
@ RafałCieślak: Yanlış. Bir inode'a tüm sabit bağlantılar, inode ile aynı erişim izinlerini paylaşır. Silmek, yani “unlink”, bir dosyanın bir dizin girişini silmek için o dosyanın inode'una ve silmek istediğiniz girişi içeren dizine ihtiyacınız var. Bu nedenle, hard-link'i oluşturmak için hangi imtiyazların kullanılması önemli değildir. Sadece (hala) yaratılış zamanındakilerle aynı olabilirler.
David Foerster

2

Yedekli sabit bağlantıları kaldırmak için bu komut dosyası var. Ama kendine iyi bak - bu oldukça tehlikelidir.

#!/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

Aslında rmişe yaramıyor:

[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

Ne işe yarıyor unlink AZP?


2
Seninkilerin sıkı bir bağlantı olduğundan emin misin? Sabit bağlantılar tıpkı dosyalar gibi.
Seth

@Seth, aslında bunun ne olduğunu hatırlamıyorum, ama görebildiğin gibi kaldırmak istemiyor. Biri bağlantı kaldırmamı söyledi ve işe yaradı. :)
Bunyk

Muhtemelen AZP bir dosyaydı, bir dizin değildi, ama daha fazla bilgi olmadan emin olamadım. Unlink her zaman olsa çalışmalı, o yüzden sorun yok.
Seth

1
AZP/Bir dizine benziyor, rm özyinelemeli bayrağı olmadan dizinlerde çalışmaz. Ayrıca coreutills docs göre. >>> Çoğu sistem bir dizine bağlantı oluşturmayı yasaklar; izin verildiği yerlerde yalnızca süper kullanıcı bunu yapabilir (ve bir döngü oluşturmak diğer birçok yardımcı programa sorunlara neden olacağından dikkatli olun).
ThorSummoner

2
Dizinlere hard link vermek yasaktır. Eğer AZPbir dizin (veya başka şeylere) sembolik link rm AZP/olmaz iş nedeniyle rm(çünkü onun bir dizin düşünen /sonunda). Ancak rm AZPsadece iyi çalışacak. -1
David Foerster

0

Yalnızca bağlantıyı kaldırmak ve böylece orijinal dosyayı saklamak istiyorsanız, bağlantıyı kaldırmanız gerekir.


Ne okudun unlink(1)mu? Bu, unlink(2)sistem çağrısı etrafındaki sığ bir sarmalayıcıdır , rm(1)dizin olmayan tüm dosyalar için kullanılan aynı sistem çağrısıdır .
David Foerster

1
Bu cevap yanıltıcıdır. Bağlantılı dosyalar ile "link" ve "original file" arasında bir ayrım yoktur; tüm sabit bağlantılar, farklı dizin girişleriyle temsil edilen aynı dosyaya / içeriğe / inode'a başvurur. unlink, ismine rağmen, bir hardlink'i iki ayrı dosyaya ayırmaz, ancak "unlinked" dizin girişini kaldırır (ancak link sayısı> 1 olduğu sürece, file / content / inode dosyasını değil).
Murphy
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.