Bulunacak dizin adlarının bir listesini alın


35

Dizin adlarının bir listesini almak için bunu yapabileceğimi biliyorum:

find . -type d -maxdepth 1 

Çıktı şöyle görünür:

.
./foo
./bar

Girişi olmadan tercih ederim ./. Yalnızca ham adların çıktısını almanın bir yolu var mı?

Listeyi biçimlendirmek için stat göndermeye çalıştım ama bu bana aynı sonucu verdi:

find . -type d -maxdepth 1 -print0 | xargs -0 stat -f '%N'

Öyleyse , önünüzde foo bar ...olmadan tek bir hatta mı istiyorsunuz ./?
Levon

Bu sadece kozmetik / estetik nedenlerden mi dolayı yoksa çıktıyla bir şeyler yapmaya mı çalışıyorsunuz?
jw013

Yanıtlar:


42

GNU ile findşu -printfseçeneği kullanabilirsiniz :

find . -maxdepth 1 -type d -printf '%f\n'

Paweł tarafından yorumlarda belirtildiği gibi, geçerli dizinin listelenmesini istemiyorsanız -mindepth 1, örneğin:

find . -mindepth 1 -maxdepth 1 -type d -printf '%f\n'

En son POSIX spesifikasyonundaki-printf seçeneğin hiçbir özelliğini bulamıyorum ve bunun ne kadar taşınabilir olduğunu merak ediyorum ...
rahmu

@rahmu: Bu GNU bulgusu ile test edildi. printfSeçeneklerin hiçbiri POSIX tarafından söylenmiyor ve diğer findsürümlerin bazıları tarafından desteklenmiyor gibi görünüyor . GNU bulma çoğu yere monte edilebilir, bu nedenle taşınabilirdir.
Thor

1
Ayrıca -mindepth 1, ondan kurtulmak istersen de ekle.
Paweł Prażak

18

Güncelleştirme:

Daha kısa bir alternatif:

 find . -maxdepth 1 -type d | cut -c 3-

Herhangi bir eğik çizgi olmadan size her satırda bir tane olacak


4
@ downvoter .. açıklaması olmayan bir zayıf oy hiç kimseye yardımcı olmaz (OP, SO veya ben). Bu OP'nin sorusuna işlevsel bir çözüm. Cevabı işaret ettiğinde veya iyileştirdiğinde bir hatayı düzeltmekten mutluyum, ancak bu yalnızca anonim bir "tıklama" yerine yapıcı geri bildirim gerektiriyor .
Levon,

1
Cevabınız ayrıştırma işlemine dahil edildiğinde oy veren kişi benim ls. Aynı zamanda, neden o zamandan beri silinmiş başka bir cevapta bunun kötü bir fikir olduğuna dair bir bağlantı yayınlamıştım . O zamanlar sadece 2 cevap vardı ve sebep açıktı. Belirsizliği gösterdiğine sevindim, işte benim açıklama. Kayıt için, oyumuzu bir oy kullandım, çünkü şu anki cevabınızı kabul ediyorum.
rahmu

@rahmu Başka bir sorudaki düşkünlüğünüz için bir açıklama yapmak bana yardımcı olmaz (ve sadece size açıktır). Ayrıca, bu daha iyi bir çözüm olsa da, daha önce yayınladığım çözüm gayet iyi çalıştı (evet, "ls kullanma" bağlantınıza aşina oldum - ama her durumda kör bir şekilde uygulanmıyor). İlk çözümümün neden işe yaramayacağına dair bir karşı örnek varsa, bunu bilmek isterim (bundan gerçekten bir şey öğrenebilirim), aksi halde sadece bir link gönderiyor ve yapıcı bir şey teklif etmiyorsunuz.
Levon

\nBir dizin adında onu almak için cut kullanamayacağınızı düşünün (ki ben oyu reddettiğimde ne yapıyordunuz). lsTehlikeli davranmayan az sayıda durum vardır ve başka bir yolla kullanılması neredeyse her zaman daha güvenlidir.
rahmu

9

GNU find'i kullanarak bulucunun geçerli dizini eşleştirmesini önlemek için -mindepth komutunu kullanabilirsiniz:

find . -type d -maxdepth 1 -mindepth 1

Bunu tekrarlı bir şekilde yapmadığınız için, bir bash glob kullanabilirsiniz:

echo */

Bir küreye / izine bir son eklenmesi yalnızca dizinlerin eşleşmesine neden olur.


1
*/nokta dosyalarını özlüyor ve sembolik bağlantılar içeriyor. Bu bir problem olabilir veya olmayabilir.
Gilles 'SO- kötülük' dur

@Gilles - Her zaman sembolik bağları kaçıracak, ancak nokta dosyaları dotglob'un ayarlanıp ayarlanmadığına bağlıdır.
jordanm

6

Izin sedbu iki karakter kaldırın:

find . -maxdepth 1 -type d | sed -e 's/^\.\///'

6

Kullanmayı tercih ederim:

 find ./ -type d -maxdepth 1 -exec basename {} \;

2

Ben genellikle kullanırım:

find * -type d

Ama istediğini yapmanın doğru yolu olup olmadığını bilmiyorum.


1
Kabuğun tüm dosya adlarını genişletmesine izin verecekseniz neden kullanım bulmalı?
Ürdün

@jordanm Sadece dizin seçmek için. echo */az ya da çok aynı şeyi yapardı (nokta dosyalarını özlüyor ve sembolik bağlantılar içeriyor), ama sonra joachim finali nasıl kaldıracağını sorardı /.
Gilles 'SO- kötülük' dur

0

AIX'de 'maxdepth' parametresi çalışmıyor.

Genelde bu benim için çalışıyor:

find ./ -type d | cut -d"/" -f2 | sort -u


0

Aradığın basenameşeye denir , unix dizin yapısını yok sayar.

Aşağıdaki örnek:

find /any/path/you/want -maxdepth 1 -type d -exec basename {} \;

cd Komutu çalıştırmadan önce gerekliliği ortadan kaldırarak çıktı için dir yolu bile dışlar.


Bazı ek bilgi:

Bunun -execyerine |(pipe) çıktı için başka bir komut bulmak için argüman olarak geçtim (ikinci komutun her çıktı satırında ilerlemesini önleyerek, çıktıya bağlı olarak komut dosyasının performansını artırabileceğini söyleyerek)

NOT: findseçenekler konumsal değildir (-maxdepth, kendisinden önce belirtilenlerin yanı sıra belirtilenleri de etkiler).

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.