Sabit bağlantıları olan (aynı klasörde veya başka bir yerde) belirli sayıda dosya içeren bir klasörünüz var ve bu dosyaların bağımsızlığını kaldırmak istiyorum, böylece bağımsız hale geliyorlar ve içeriklerindeki değişiklikler herhangi bir şeyi etkilemeyecek diğer dosya (bağlantı sayısı 1 olur).
Aşağıda, temel olarak her bir sabit bağlantıyı başka bir konuma kopyalayan, sonra yerine geri taşıyan bir çözüm veriyorum.
Ancak bu yöntem oldukça kaba ve hata eğilimli görünüyor, bu yüzden bir dosyayı benim için hardlink bağlayacak bazı komut olup olmadığını bilmek istiyorum.
Kaba cevap:
Sabit bağlantıları olan dosyaları bulma ( Düzen : Sabit bağlantıları olan soketleri vb. Bulmak için find -not -type d -links +1
) kullanın :
find -type f -links +1 # files only
find -not -type d -links +1 # files, sockets etc.
Bir dosyanın bağlantısını kaldırmak için kaba bir yöntem (başka bir konuma kopyalayın ve geri taşıyın):
Düzenleme: Celada'nın dediği gibi, zaman damgalarını ve izinleri kaybetmemek için aşağıda bir cp -p yapmak en iyisidir. Düzenleme: Geçici bir dizin oluşturun ve geçici bir dosyanın üzerine yazmak yerine altındaki bir dosyaya kopyalayın, mv
komut hala riskli olsa da (teşekkürler @Tobu) bazı verilerin üzerine yazma riskini en aza indirir . Düzenleme: Aynı dosya sisteminde geçici dizini oluşturmaya çalışın (@MikkoRantalainen).
# This is unhardlink.sh
set -e
for i in "$@"; do
temp="$(mktemp -d -- "${i%/*}/hardlnk-XXXXXXXX")"
[ -e "$temp" ] && cp -ip "$i" "$temp/tempcopy" && mv "$temp/tempcopy" "$i" && rmdir "$temp"
done
(Yani, tüm sabit bağlantıları un-hardlink Düzenleme : değişmiş -type f
için -not -type d
, yukarıya bakınız):
find -not -type d -links +1 -print0 | xargs -0 unhardlink.sh
cp -i
anahtar, onu geçersiz kılmak gerektiğini soran bana birkaç mesajlar tükürdü ./fileXXXXXX
( $temp
, tmpfile benzersiz dosya adları vermelidir rağmen dosyası) orada böylece şırası bir çeşit yarış koşulu ya da her neyse ve bununla birlikte bazı verileri kaybetme riski.
unhardlink.sh
kaldırılması gereken dosyayı içeren aynı dizinde geçici bir dizin oluşturmanız gerekir. Aksi takdirde, özyinelemeli çağrınız başka bir dosya sistemi içinde geri çekilebilir ve geçici dizininiz geçerli çalışma dizininde olduğundan, dosya sistemi sınırları üzerinde bir şeyler taşırsınız. Bunun "$(dirname "$i")/hardlink-XXXXXX"
yerine mktemp'e argüman olarak geçebilirsiniz.
fuse
dosya sistemi ise, aslında bundan path/to/hardlink-XXX
farklı bir fiziksel depolama ortamına gönderilebileceğini path/to/original-file
, ancak bununla ilgili yapılabilecek çok şey olmadığını unutmayın.