Aynı ada sahip tüm dizinlerin içindeki alt dizinleri bulma


8

Bir komut çalıştırmak istiyorum:

  1. " inc" Bir klasör altında " " adlı tüm dizinleri bulun X.
  2. Her " X/.../inc/" altındaki tüm alt dizinleri listeleyin .
  3. Çıkışı " list" adlı bir dosyaya yönlendirin

Aşağıdaki komutun çeşitli kombinasyonlarını başarılı olmadan denedim:

$ find X/ -name "inc" -print | xargs find {} -type d > list
find: path must precede expression

Bunu nasıl yapabilirim?

Yanıtlar:


13

find bunu tek başına yapabilir:

find X -path '*/inc/*' -type d > list

Daha fazla bilgi için -pathbölümünü okuyun man find.

Bir yorumda hızlı bir şekilde belirttiğim gibi: dizin satırını bir metin dosyasında ayrılmış olarak saklarsanız, yeni satırlar içeren dizin adları açık bir şekilde temsil edilemez. Eğer varsa bazı dizinleri sorun yok yani, yeni satır içermediğini. Sadece genel bir yorum.


evet. Aynı cevabı burada
Prens John Wesley

Veya X -adını 'inc' -type d> listesinden
bulun

@MaQleod: Hayır, soru bu değil.
Daniel Andersson

4

İşte kullanışlı bir tek astar:

find X -type d -name "inc" -exec sh -c 'find {} -type d' \; > list

findİlk findsonuçların her birinde çalışır . execDediğim gibi - - seçeneği de minimal bir kabuk komutu, hangi alabilir {}ilk her dizinde ile değiştirilir find.

İkincisi find, isteğinize göre, dizin dahil ilk sonuçların "tüm alt dizinlerini listeler" inc. Kendini çıktıda istemiyorsanız, ikinci find en azından derinlik 1'in çıktı klasörlerini bırakın .

find X -type d -name "inc" -exec sh -c 'find {} -mindepth 1 -type d' \; > list

Daha sonra komutun stdoutiçine yönlendireceğiz list.


Bu cevabın bir varyasyonu bana sadece orijinal maçın derinlik 1 alt dizinlerini istediğimde yardımcı oldu find path -name inc -type d -exec sh -c 'find {} -mindepth 1 -maxdepth 1 -type d' \;
Core

1

Tamam, bu iç içe bulguyu simüle etmek için cevap bulduk

find X/ -type d | grep "/inc/" > list

Güzel, bu da işe yarayacak! Ancak, Unix / Linux kabuklarda, gerçekten diye bir şey yoktur cevap. Kişisel tercihlerin ve takip edilmesi kolay bir karışım.
Vishal Kotcherlakota

Örneğin yeni satırlar ile sıradışı (ama mevcut) dosya adları özen için: find X/ -type d -print0 | awk 'BEGIN{RS="\0"}/\/inc\//' > list( grep -zaynı zamanda öylesine sonra bir örneğin içinden boruya ihtiyaç olur, null karakteri yolunu sınırlayacak, ancak çıkış boş yanı ayrılmış gibi görünüyor xargs -0L1 echoo çizgiyle hat almak için ). Bu durumda, listeyi her satır yeni satırla ayrılmış olarak dosyaya kaydettiğiniz için, dosya adlarındaki yeni satırlar hala belirsiz bir şekilde temsil edilir. Listeyle ne yapmak istediğinize bağlı olarak, ara dosyaya bile ihtiyacınız yoktur.
Daniel Andersson

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.