Linux `` bul '' yardımcı programında ilk genişlik seçeneği?


12

Linux `` find '' yardımcı programında önce genişlik / önce derinlik seçeneği var mı?

Yanıtlar:


5

Bulmak için yerleşik bir şey yok, hatta GNU buluyor. findEğik çizgi sayısına göre sıralamak için çıktısını sonradan işleyebilirsiniz , örneğin Perl ile:

find ... | perl -e 'print sort {$a=~s!/!/! <=> $b=~s!/!/!} <>'
  • <> tüm girdi satırlarının listesidir;
  • $a =~ s!/!/!g$asıralama ölçütü olarak kullandığımız eğik çizgi sayısıdır .

Eğer zsh kullanabiliyorsanız:

echo **/*(oe\''REPLY=${REPLY//[^\/]}'\')
  • **/* geçerli dizindeki ve alt dizinlerdeki tüm dosyaları listeler.
  • Parantez içindeki şeyler bir glob niteleyicisidir.
  • Glob niteleyicisi oe, eşleşmelerin döndürülme sırasını kontrol eder: başlangıçta eşleşen yola ayarlanmış olan REPLYher bir eşleşme için koda burada koyduktan sonraki değere göre sıralanır REPLY.
  • Bahsedilen kod, $REPLYeğik çizgiler hariç her şeyi silmek için dönüşür . Sonuç, derinlik 1'deki her şeyden (boş sonuç $REPLY), sonra derinlik 2'deki ( $REPLYbiter /), derinlik 3 ( //) vb.

1
Sıralama sonrası işlemi çok ilginç, ancak sıralama tamamlanması gereken bulmaya ihtiyaç duyuyor ve molayı kontrol etme şansınız olmayacak.
Xiè Jìléi


1

Benim hislerim yapabiliyorsun. Grep ve benzeri bir döngü içerir, ancak özellikle tamamlamanız gerekmeyen bulmayla ilgili durumunuz için çok iyi çalıştığını düşünüyorum.

Aşağıdakiler nedeniyle kaynak yoğunluğu daha fazladır:

  • Çok fazla çatal
  • Çok sayıda bulgu
  • Geçerli derinlikten önceki her dizin, dosya yapısına toplam derinlik kadar çok kez bulunca vurulur (pratikte herhangi bir miktar ramınız varsa bu bir sorun olmamalıdır ...)

Bu iyi çünkü:

  • Bash ve temel GNU araçları kullanır
  • İstediğiniz zaman kırılabilir (uçmak için aradığınızı gördüğünüz gibi)
  • Bulgu başına değil satır başına çalışır, bu nedenle sonraki komutların bir bulmayı ve bir sıralamayı beklemesi gerekmez
  • Gerçek dosya sistemi ayrımına dayalı olarak çalışır, bu nedenle içinde eğik çizgi bulunan bir dizininiz varsa, olduğundan daha derin listelenmez; farklı bir yol ayırıcısı yapılandırılmışsa, sorun olmaz.
#! / Bin / bash 
derinlik = 0

-mindepth $ derinliği bulmak -makinepth $ derinliği | grep '.'
yapmak
    derinlik = $ ((derinlik + 1))
tamam

Ayrıca bir satıra kolayca (?) Kolayca sığdırabilirsiniz:

depth=0; while find -mindepth $depth -maxdepth $depth | grep --color=never '.'; do depth=$((depth + 1)); done

Ama yazarken küçük scriptleri tercih ediyorum ...

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.