Yalnızca find komutundan dosya adlarını nasıl döndürürüm?


14

Bir terminalden find komutu yürütürken sadece dosya adlarının (yolun geri kalanı olmadan) bir listesini almak için arıyorum. Bunu Mac'te nasıl başarabilirim?

Yanıtlar:



6

Evilsoup, gönderilenlerin aralıklı dosya adları için çalışmadığını belirtti. Bunun yerine şunları kullanabilirsiniz:

find . -type f -print0 | while IFS= read -r -d '' filename; do echo ${filename##*/}; done

Bu, adlarında boşluk bulunan dosyalara
zarar verir

Hız için +1. Yanlış bir şey yapıp yapmadığımı bilmiyorum, ancak bu benim $ HOME'da 1 saniye sürerken, diğerleri 10 saniye sürdü. Tabii ki, bunu aramak ve yazmak için 10 saniyeden fazla zamana ihtiyacım vardı.
Paulo Almeida

2

GNU find ile şunları yapabilirsiniz:

 find ~/tmp/ -printf "%f\n"

Bu muhtemelen OS X'te de denemeye değer.


2
-printfOS X'in BSD'sinde desteklenmez find.
Daniel Beck

1
Ayrıca, -printfC printfveya POSIX kabuk yardımcı programı ile çok az ilişkisi vardır printf. Bu tarihi işlev adını farklı bir şey için kullanmak çok kötü bir şekilde düşünülür. Muhafazakar BSD adamları muhtemelen aynı şekilde görüyorlar, bu yüzden muhtemelen -printfBSD bulmasında klon görmeyeceğiz , bu isim altında.
Kaz

Benzer bir görevi farklı bir bağlamda gerçekleştirmek için tanıdık bir işlev adı kullanmanın kötü kabul edildiğini kabul etmiyorum. BSD'nin neden asla desteklemeyeceği başka bir konudur.
Ярослав Рахматуллин

2

Bir dosya yolunun son kısmı hariç her şeyi soymanın daha iyi bir yolu vardır; awk ile. Daha iyidir çünkü awk her dosya için bir kez çalıştırılmaz. Bazı durumlarda bu önemlidir.

find ~/tmp/ -type f  | awk -F/ '{ print $NF }'

Yalnızca ~ / tmp içindeki dosyaları ararız ve her girdinin eğik çizgilerle ayrıldığı bir liste alırız. Bu nedenle, alan ayırıcısı (-F /) olarak eğik çizgi kullanıyoruz ve son alana ($ NF) karşılık gelen alan parametresini ($ 1 .. $ 9) yazdırıyoruz.


Bu test ettiğim en hızlı şey.
Paulo Almeida

Son zamanlarda Cygwin kullanıyorum ve pencerelerde bir süreç oluşturmak çok pahalı ...
Ярослав Рахматуллин

2

DÜZENLE :

Kullanma sed:

$ find . -type f | sed 's/.*\///'

@Nerdwaller yanıtında belirtildiği gibi xargs komutunu kullanma

$ find . -type f -print0 | xargs --null -n1 basename

1
Birini işaret ettiğiniz için teşekkürler, +1, xargs'ı çok fazla kullanmadım ... Kesinlikle komutumdan birkaç karakter bırakmış olmalısınız.
nerdwaller

Dosya boşluk olduğunda bu kırılır. En azından hızlı bir testte şu şekilde çalışır:find . -type f -print0| xargs --null -n1 basename
Paulo Almeida

Ne bir --nullveya -n1seçenekler OSX mevcuttur
Valeriy Van

1

Peki buna ne dersin:

find … | egrep -o -e '[^/]+$'

Avantajı: Her sonuç için bir tane değil, yalnızca bir ek süreç ortaya çıkar.


0

Sen diyebilirsin shBul'un içinden -execseçeneği ve uneccesary boruları kullanmaktan kaçının. Bunun avantajı, komik dosya adları (boşluklar, yeni satırlar, vb.) Hakkında endişelenmenize gerek olmamasıdır:

find . -type f -exec sh -c 'echo "${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.