Geçerli PATH içindeki tüm dosyaları / ikili dosyaları listele


10

Geçerli PATH içindeki tüm dosyaları / yürütülebilir ikili dosyaları listelemek için "ls -la" tarzı komut çalıştırmanın "kolay" bir yolu var mı?

(Ben bilinmeyen önekleri ama temelde bilinen "isimleri", bash otomatik tamamlama / sekme aslında işe yaramaz durumda tür komutları aramak için çıkış grep içine boru niyetinde. tam özellik "...)


Örnek verebilir misiniz? İle nasıl farklı olacak ls -la?
John Siu

"ls -la" / "ls -a" yalnızca geçerli dizininizdeki (pwd) dosyaları listeler. PATH dahil tüm dizinlerdeki tüm (yürütülebilir) dosyaları listelemek istiyorum.
sme

Yanıtlar:


19
compgen -c # will list all the commands you could run.
compgen -a # will list all the aliases you could run.
compgen -b # will list all the built-ins you could run.
compgen -k # will list all the keywords you could run.
compgen -A function # will list all the functions you could run.
compgen -A function -abck # will list all the above in one go. 

Güzel, aradığım şey bu. Geçerli dizine yürütülebilir ikili dosyalar bile ekler. Teşekkürler.
sme

İyi çalışıyor ... bash.
Emanuel Berg

Bunların her birinin yolunu yapmadan listelemenin bir yolu var which $(compgen -A function -abck)mı?
h3rrmiller

Daha iyi bir alternatif bulamadım.
Nykakin

3

İşte dizinlerin içeriğini listeleyen bir fonksiyon $PATH. Bağımsız değişkenler iletildiyse, işlev yalnızca adı bağımsız değişkenlerden birini içeren komutları listeler. Argümanlar glob kalıpları olarak yorumlanır.

shopt -s extglob
lspath () {
  local IFS pattern
  IFS='|'
  pattern="*@($*)*"
  IFS=':'
  for d in $PATH; do
    for x in "$d/"$pattern; do
      [ "$x" = "$d/$pattern" ] || echo "${x##*/}"
    done
  done | sort -u
}

Birçok şey gibi, bu zsh'da daha kolaydır.

lspath () {
  (($#)) || set ''
  print -lr -- $^path/*$^@*(N:t) | sort -u
}

^Karakter parametresi genişleme dizisi ile birleştirilmiş metin, her bir dizi elemanı, örneğin, ilave neden olur path=(/bin /usr/bin); echo $^path/foobaskılar /bin/foo /usr/bin/foo.
/*$^@*çizgi roman hakaretine benziyor ancak aslında sıradan karakter /, joker karakter *, değiştiricili özel parametre $@(konumsal parametre dizisi) ^ve tekrar *.
(N:t)olan topak eleme N ardından hiçbir eşleşme varsa boş bir genişleme almak için tarih değiştirici t her maçın sadece basename ( “kuyruk”) tutmak.

Daha şifreli, dış çağrıdan kaçınır, ancak bu sadece kozmetik ilgi çekicidir:

lspath () {
  (($#)) || set ''
  local names; names=($^path/*$^@*(N:t))
  print -lr -- ${(ou)names}
}

Aslında apropos, kısa açıklaması bir anahtar kelime içeren komutların man sayfalarını arayan komutu arıyor olabilirsiniz . Bir sınırlama, bunun yalnızca bir man sayfası olan komutları bulmasıdır.


Zsh işlevinde, ikincisi ^"argüman yok" çağrısı için çıktı vermiyor gibi görünüyor mu? Bırakırsanız, hepsini listeleyebilir ve yine de tek anahtar kelimeleri arayabilirsiniz (ancak bunların listesini değil). (Non:t)Yıldız işaretleri genişletilmiş gerektiğini söylemek gibi görünüyor? Sonuncusunu anlayamadım.
Emanuel Berg

@EmanuelBerg Doğru, düzeltme için teşekkürler. Hat gürültüsü hakkında bir açıklama ekledim.
Gilles 'SO- kötü olmayı bırak'

Tamam, bir bakalım: Eğer argüman yoksa, “onları” hiçbir şeye ayarlamazsınız, çünkü orada olan (hiç yoktu), bir şekilde daha sonra yaptığınız şeyleri yıkıcı mıydı? Ayrıca, hiç küçük harf görmedim path, ama kabuğunda çalıştırdığımda, aslında $ PATH ama yerine boşluk var :. Gerisi kristal berraklığında :)
Emanuel Berg

@EmanuelBerg No: bağımsız değişken yoksa, bağımsız değişken dizisini boş dizeyi içeren tek öğeli bir dizi olarak ayarladım. Bu şekilde, hiçbir argüman boş dizeyi içeren her adın, yani her adın eşleştiği anlamına gelir. $pathbir zsh özelliğidir: bağlı bir parametredir , güncellendiğinde otomatik olarak güncellenen bir dizidir PATHve tersi de geçerlidir.
Gilles 'SO- kötü olmayı bırak'

Aha, şimdi anladım! Vay canına, bu alışılmışın dışındaydı!
Emanuel Berg

1
function findinpath () { 
   OLDIFS="$IFS" ; 
   IFS="$(printf ':\t\n')" ; 
   for regexp in "$@" ; do 
      for adir in $PATH ; do 
         find "$adir" -perm -111 -a ! -type d -ls 2>/dev/null | grep -i "/[^/]*$regexp"
      done ; 
   done ; 
   IFS="$OLDIFS" ; 
}

find yalnızca aşağıdakilerle eşleşir: en az bir "x" (yürütülebilir) bit ayarlı ve bu bir dizin değil.

ve bulunacak normal ifade listesiyle birlikte kullanın:

findinpath awk sed '\.sh$'

regexp "." size her şeyi gösterecek
Olivier Dulac

normal IFS ile, $ PATH'nizde çift girişleri bulabilirsiniz:echo $PATH | tr ':' '\n' | sort | uniq -d
Olivier Dulac

1
Tüm cevaplar için kod denedim ve bu aslında bana ne aradığını verdi tek olanı (PATH verilen bir komutun her örneğine tam yollar).
Chris Sayfa

Yardım ettiğine sevindim :)
Olivier Dulac

1
for i in $(echo $PATH | sed -e 's/\:/\ /g'); do find "$i" -perm +rwx -exec echo {} \; 2> /dev/null; done

önce $PATHsed'e yankılanıp ":" yerine "" yazıyoruz.

o zaman rwx ile dosyaları bulmak ve yankılamak için bu şeylerin her birini buluyoruz.

2> /dev/null öyle find hataları yazdırmaz


3
bulmanızda bir -maxdepth 1ve -type fbulmanız gerekir, aksi takdirde alt dizinleri ve dosyalarını bulabilirsiniz (PATH araması olmaz). Ayrıca, izin testiniz tuhaf - sadece +xdüşünür müsünüz?
derobert

Bu, geçerli boş bir girişin '.' İle aynı olması durumunda, örneğin :/binveya /bin::/usr/bin. Eklemeyi deneyin s/::/:.:/;s/^:/.:/;s/:$/:./için sedkomuta.
Arcege

Aslında finddaha fazla yol arayabilir, böylece döngü olmadan yapabilirsiniz: find $(echo $PATH | sed -e 's/\:/\ /g') -perm +rwx …Tabii ki, boşluk içeren dizin isimleri onu kirletir, ancak döngü tabanlı olan yine de aynı soruna sahiptir.
manatwork

@manatwork haklısın. Bu sorunu çözmek için alıntılar ekledim
h3rrmiller

Üzgünüm, bu hiçbir şeyi çözmez. Sorun kelime bölünmesine izin vermek için iki nokta üst üste işaretlerini boşluklarla değiştirmektir. Böylece “/ foo bar: / fiz baz” ı “/ foo bar / fiz baz” a dönüştürürsünüz for. Böylece for4 kelimelik bir liste üzerinde döngü. İşlemek için kelime bölme daha iyi ayarlamak IFSihtiyaca göre: IFS=':'; find $PATH -perm +rwx ….
Manatwork
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.