Sembolik bağların tümünü değil hepsini takip etmeyi nasıl bulurum?


10

İşletim sistemim ve giriş dizinim bir SSD'de. Bazı büyük dosyaları sabit diskte saklıyorum ve giriş dizinimden sabit diske symlink (örn. ~ / Videos / Films / mnt / hdd / Films için bir sembolik bağlantı). Ayrıca her biri / z: / symlinked dosdevices / sahip birkaç şarap önek var.

Eğer -L'siz bulmayı kullandıysam, sabit diskteki her şeyi özleyecek. Ancak -L ile find kullanırsam, Wine'ın / işaretine bağlı olarak bir döngü halinde sonuçlanır.

Bunu çözmenin mantıklı bir yolu var mı, bu yüzden istediğim yerde arama bulabiliyor musunuz? Sezgisel olarak, "dosdevices adı verilen bir dizinin altında olmadıkça" simgeleri takip et "satırları boyunca bir şey istiyorum. "Sabit diskteki bir şeyin sembollerini izleyin" de işe yarayacaktır.

Yanıtlar:


11

-pruneBirincil söyler findbir dizinin altına recurse değil.

find -L -path ~/.wine/dosdevices -prune -o -type f -name 'My Favorite Movie.*' -print

Durumunuzda kullanmak istiyorsanız -lname, -Lseçeneği kullanamazsınız , çünkü -Lçoğu tahmin, dahil olmak üzere bağlantının hedefi üzerinde hareket eder -lname. Bu durumda önerim, hem ana dizininizi hem de sabit disk kökünü aramanızın kökleri olarak kullanmak olacaktır.

find ~ /mnt/hdd -xtype f -name 'My Favorite Movie.*'

find ~ -type l …Sembolik bağlantıların bir listesini toplamak ve bunları ek kökler olarak kullanmak için koşabilirsiniz .

( IFS=$'\n'; set -f;
  find ~ $(find ~ -type l -lname '/mnt/hdd/*') \
       -xtype f -name 'My Favorite Movie.*' )

Gerçekten sembolik bağlantılar altında tekrarlamak istiyorsanız, belirli sembolik bağlantıları ad yerine hedefe göre hariç tutabilirsiniz. Ancak bu şekilde bir desen veya alt ağaç değil, yalnızca sınırlı bir listeyi hariç tutabilirsiniz.

find -L \( -samefile /exclude/this -o -samefile ~/and/that \) -prune -o \
     -type f -name 'My Favorite Movie.*' -print

! -writable(Yazma izniniz olmayan dosyalar) gibi diğer ölçütleri kullanabilirsiniz , ancak GNU bulmanın yalnızca hedef metinleri belirli bir ifadeyle eşleşmesi durumunda sembolik bağlantılar altında geri çekmenin bir yolu olduğunu düşünmüyorum.

findYeterli sembolik bağlantıları hariç tutmamak dışında neredeyse istediğinizi yapan bir komut oluşturabilir , sorguyu bir Perl komut dosyasına dönüştürmek için find2perl komutunu çalıştırabilir ve Perl komut dosyasını biraz değiştirebilirsiniz. Bununla birlikte, find2perl'in tanımadığı birçok GNU anahtarı vardır.


Teşekkürler! -prunesadece aradığım şey. Ben fark ettik find ~ \( -lname ~ -o -lname ~/\* -o -lname / \) -xtype dlisteleri tüm sembolik ı takip etmek istemiyorum; Şimdi bu sorgu budamak için kullanmak için bir yol bulmaya çalışıyorum.
Mark Raymond

@MarkRaymond Genel prensip find ~ <negative criteria> -prune -o <positive criteria> -print, öyleysefind ~ \( -lname ~ -o -lname ~/\* -o -lname / \) -xtype d -prune -o <whatever it is you want> -print
Gilles 'SO- kötü olmayı bırak

@Giles - -L olmadan iyi çalışır, ancak -L ekledikten sonra -lname ifadeleri artık çalışmaz (man sayfasının yapmayacağını söylediği gibi). Yani temelde simgelerini takip etmek için bazı koşullara ihtiyacım var ve diğerleri takip etmiyor!
Mark Raymond

Bulmak istediğiniz şeyi tam olarak yapmanın bir yolunu düşünemiyorum. Bazı tahminler için düzenlememe bakın.
Gilles 'SO- kötü olmayı bırak

1

TÜM bağlantıları aramak için, bu benim için çalıştı:

find -L . -name \*.txt

0

Sabit disklere kaç sembolünüz var? Çok fazla değilse, find komut satırında takip etmek istediğiniz sembolik bağlantıları açıkça belirtirken "-L" kullanmamak çözümdür. Gibi bir şey:

find .  ~/Videos/Films -name '*file I want*' ...

Bu, geçerli dizinde (".") Ve "~ / Videos / Films" sembol işaretinde arama yapar, ancak diğer sembollere inmez.


0

Sorunun yan adımlarını gerçekleştiren bir başka çözüm (en azından benim durumum için), sabit diskteki dizinler için sembolik bağlantılar yerine bağlama bağları kullanmaktır. Bu, aşağıdaki /etc/fstabgibi girişler ekleyerek yapılır :

/mnt/hdd/Films /home/mark/Videos/Films none bind 0 0

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.