Bir dosya sistemindeki tüm bağlantılı dosyaları nasıl bulabilirim?


21

Belirli bir dosya sistemindeki tüm sabit bağlantılı dosyaları bulmam gerekiyor. Örneğin, dosyaların bir listesini alın, her satırda bağlantılı çiftler veya üçüzler vb. Bulunur.

Az ya da çok nasıl yapılacağını anlıyorum, bir dosya sistemindeki tüm dosyalar / dizinler için inode tarafından anahtarlanmış bir sözlük oluşturmanız gerekiyor, "hariç". ve ".." bağlantıları, ve sonra birden fazla isme sahip indodes hardlinks ... Ama umarım belki hazır bir çözüm vardır, ya da birisi böyle bir senaryo yazmıştır.

Yanıtlar:


17

Aşağıdaki komutu çalıştırabilirsiniz:

find / -type f -printf '%n %p\n' | awk '$1 > 1{$1="";print}'

tüm sabit bağlantılı dosyaları bulmak için.

Veya @mbafford sürümü:

find / -type f -links +1 -printf '%i %n %p\n'

1
Teşekkürler, tam olarak istediğim bu değil, yeterince yakın. Ben inode numaralarını yazdırmak için '% i' ekleyebilir ve daha sonra sıralamak / gruplandırmak ...
haimg

15
Find'ın "-links + n 'sözdizimini kullanarak awk ihtiyacını önleyebilirsiniz. Örn. En az iki bağlantılı tüm dosyaları bulmak ve gerekli bilgileri yazdırmak için:find / -type f -links +1 -printf '%i %n %p\n'
mbafford

sort(+ uniq) üzerinden borulamaya ne dersiniz ? i ana bilgisayar (16GB i5-2500k ssd ile) bir gitmek verdi merak vardı. 2187757 dosya ( find / -xdev -type f | wc) ile 3820 dosya / 570 inode ( time sudo find / -xdev -type f -links +1 -printf "%i\n" | sort | uniq | wc) döndürürken 12 gerçek saniye alır . %n %pben inode saymak için onları çıkardı gibi gerçek dosyaları için eklemek gerekir .
north-bradley

17
find . -type f -links +1 2>/dev/null

birden fazla bağlantısı olan tüm dosyaların bir listesini verir, yani sabit bir bağlantı bulunan dosyalar. Bunun üzerine döngü yapmak nispeten kolaydır - çok sayıda dosyaya sahip değilseniz hacky bir çözüm

for i in $(find . -type f -links +1 2>/dev/null); do find -samefile $i | awk '{printf "%s ", $1}'; printf "\n"; done | sort | uniq

Ama içtenlikle daha iyi çözümler olduğunu umuyorum, örneğin ilk findçağrı inode numaralarını yazdırıp sonra bu inode ile ilişkili tüm dosyaları göstermek için find' -inumseçeneğini kullanarak .


1
Ah! Bu, her bağlı dosya için dosya sistemini tekrar tekrar tarar ...
haimg

1
Hızlı olduğunu iddia etmedim - ve küçük dizin ağaçları için bir tür işler. Tabii ki, örneğin çıktısından oluşturulabilecek uygun bir indeks, kişinin find . -type f -printf '%i %p\n'çok daha hızlı bir çözüm oluşturmasına izin verecektir.
Claudius

Ve bu AFAIK yolunda yer tutmuyor.
Gilles Quenot

İçin fordöngü, ayarlama IFS buna göre çalışır. Yorumumdaki find komutunun çıktısını ayrıştırmak için, dosya adı olarak ilk boşluk ile satır sonu arasında her şeyi bildirmek de işe yarayacaktır.
Claudius

1
@Sati: hata mesajlarının atılmasını sağlar (örneğin, beğenmediğiniz klasörler lost+foundvb. İçin); bu, eğer çıktı ikinci satırdaki gibi işlenecekse özellikle önemlidir.
DJCrashdummy

1

IMHO'nun en iyi yolu aşağıdaki satırı kullanmaktır (kesin /PATH/FOR/SEARCH/olarak aramak istediğiniz şeyle değiştirmek zorundasınız ):

find /PATH/FOR/SEARCH/ -xdev -printf '%i\t%n\t%p\n' | fgrep -f <(find . -xdev -printf '%i\n' | sort -n | uniq -d) | sort -n

bu dosya sistemini yalnızca bir kez tarar, inode, hardlink sayısını ve birden fazla hardlink içeren dosyaların yolunu gösterir ve bunları inode'a göre sıralar.

okuma izniniz olmayan klasörler için hata mesajları sizi rahatsız ediyorsa satırı şu şekilde genişletebilirsiniz:

find /PATH/FOR/SEARCH/ -xdev -printf '%i\t%n\t%p\n' 2> /dev/null | fgrep -f <(find . -xdev -printf '%i\n' 2> /dev/null | sort -n | uniq -d) | sort -n
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.