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?
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:
Basename ile:
find . -type f -exec basename {} \;
;
sonlandırır -exec
. \
Çünkü gerekli olan ;
aynı zamanda kabuğuna özel bir anlamı vardır.
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
GNU find ile şunları yapabilirsiniz:
find ~/tmp/ -printf "%f\n"
Bu muhtemelen OS X'te de denemeye değer.
-printf
OS X'in BSD'sinde desteklenmez find
.
-printf
C printf
veya 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 -printf
BSD bulmasında klon görmeyeceğiz , bu isim altında.
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.
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
find . -type f -print0| xargs --null -n1 basename
--null
veya -n1
seçenekler OSX mevcuttur
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.