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.