Simgeleri olmayan dosyaları nasıl listeleyebilirim?


10

Çeşitli belgelerle dolu büyük bir "myfiles" dizinim var ve yapısını değiştirmek istemiyorum.

Bu nedenle her bir belge sınıfı için (birkaç) başka dizin oluşturdum. Örneğin , "myfiles" dizinindeki her dosyaya .jpgveya .cr2dosyaya artı (açıklamaları ve diğer meta verileri içeren) her bir simge bağlantısı (aynı dosya adıyla) için diğer açıklayıcı dosyalar içeren bir "görüntüler" dizinim var. / İmages dizinindeki sembolik bağlantılar, bağlı orijinal dosyadan farklı bir ada sahip olabilir.

Ben "myfiles" dizinindeki her görüntü dosyası "görüntüler" dizinine bir symlink olduğundan emin olmak için en basit yolu bulmaya çalışıyorum.

Klasör yapısı örneğine bakın

/myfiles/a.doc
/myfiles/b.jpg
/myfiles/c.cr2
/myfiles/d.mov

sonuç vermeli

/images/b_800x600.jpg
/images/b_800x600.desc
/images/c_3820x5640.cr2
/images/c_3820x5640.cr2

Tam bir cevap değil, ancak find /myfiles -type fbir dosyanın sonuçlarını kaydedebilir, sonra işaretlenmiş find /images -type l -exec readlink {} \; | egrep myfilesdosyaların bir listesini almak için kullanın ve daha /imagessonra sedkaydettiğiniz ilk dosyadaki yolları silmek için her biri üzerinde bir tane yaparak sonuçlar üzerinde tekrarlayın symlink ve kalan dosyalar symlink olmayan dosyalardır .
Bratchley

2
Bunun yerine hardlink kullanmanız mümkün mü, böylece linklerinizin olup olmadığını görmek için hardlink sayacını kullanabilirsiniz? ls -lBunu kullanarak ikinci sütunda sabit bağlantı sayısını görebilirsiniz.
Lambert

@Lambert ne diyorsa onu yap. rmbu symlink dirs ve pax -rwl -s "\|.*regex|modifes_filename|" /path/to/myfiles/*.jpg /path/to/jpg_dirörneğin sadece jpgs eşleşen dosyaları için programlı olarak değiştirilmiş dosya adları ile hardlink almak için kullanın . Bundan daha fazlasını elde edebilirsiniz - değişim sürelerine ve benzerlerine dayalı
harmanlama

Yanıtlar:


6

Soruyu doğru bir şekilde anlayamazsam, resimlerimde sembolik olmayan dosyalara ihtiyacınız var:

#!/bin/bash

OIFS="$IFS"
IFS=$'\n'

files="$(find myfiles/ -type f -name '*.jpg' -or -name '*.cr2')"
for f in $files; do
    list="$(find -L images/ -xtype l -samefile "$f")"
    if [[ "$list" == "" ]]; then
        echo "$f does not have symlink."
    fi
done

IFS="$OIFS"

Dizin myfiles / 1 dosyasında a.jpg dosyası varsa ve dizin görüntüleri / 3'te o dosyaya bir sembol bağınız varsa veya sadece görüntülerde / dosya eksik symlink ile rapor edilmezse bu yaklaşımla ilgili bir uyarı vardır.


Teşekkürler ! Evet doğru anladınız. Kapat ama tam olarak değil. Benim hatam senin değil :-) Verdiğim örnek basit bir myfiles dizinini gösteriyor. Gerçekte, dosyamın altındaki görüntü dosyaları herhangi bir rastgele iç içe dizin seviyesinde olabilir.
Robert Alexander

Tüm dosyalarda arama yapmak için cevabı düzenledim, ancak bunun istediğini kontrol et.
taliezin

ALMOST orada :-) Senaryo dosyalarında boşluk olduğunda (ve belki de tek apostrophes gibi başka boklar "
Robert Alexander

Sanırım şimdi iyi olmalı
taliezin

Son değişikliğiniz her n harfinin sonunda her f'yi böler! :-) IFS satırını IFS = sonra klavyeden yeni bir satır sonra başka bir "cnahged. Şimdi bölünmüş çalışıyor gibi görünüyor ama" missinglinks.sh: 11: missinglinks.sh: [[: bulunamadı "
Robert Alexander

3

Altındaki dosyaların myfilessembolik bağlantılar olmadığını ve dosya adlarının hiçbirinin yeni satır içermediğini varsayıyorum . (Bu varsayımlar ihlal edildiyse yine de yaklaşımım işe yarayabilir, ancak daha karmaşık hale gelir.) Ayrıca ortak bir readlinkprograma -fsahip olduğunuzu ve Linux'ta (GNU ve BusyBox) olduğu gibi yolları kanonikleştirmeyi desteklediğini varsayıyorum , ancak örneğin OSX.

Dosyaların bir listesini oluşturun ve iyi bir ölçü için sıralayın:

find /myfiles -type f -print | sort >all.list

Mutlak yollarla sembolik bağlantı hedeflerinin bir listesini oluşturun.

find /images -type f -exec readlink -f {} \; | sort >linked.list

Bağlantılı olmayan dosyaları listeleyin:

comm -32 all.list linked.list

İşlem ikamesini destekleyen bir kabuk kullanıyorsanız, hepsini tek bir komutta koyabilirsiniz:

comm -23 <(find /myfiles -type f -print | sort) \
         <(find /images -type f -exec readlink -f {} \; | sort)

Aşağıdaki bağlantılar /imagesmutlaksa, * BSD ve OSX altında readlinkbulunan -fseçenek olmadan kullanabilirsiniz .


Senin emrin gibi bir şey göndermek üzereydim commama şimdi senin zaten yaptığını görmeyeceğim. Ancak, yönlendirme sortmantıklı değil; işlem ikameleri hiçbir şey üretmeyecektir. Ayrıca, bir dizi dizinin herhangi birinden bağlanmayan /imagesdosyaları bulmak istiyorsanız, birçok dizin ekleyebilirsiniz . /myfiles/images
üçlü

1
Alternatifler için stackoverflow.com/questions/7665/… adresine bakınreadlink -f
tripleee

@tripleee Süreç yönlendirme sürümünü oluşturduğumda yeniden yönlendirmeyi kaldırmayı unuttum, teşekkürler. Evet, diğer dizinleri kolayca ekleyebilir veya başka varyasyonlar yapabilirsiniz.
Gilles 'SO- kötü olmayı bırak
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.