현재 PATH의 모든 파일 / 바이너리 나열


10

현재 PATH의 모든 파일 / 실행 파일 바이너리를 나열하기 위해 "ls -la"스타일 명령을 실행하는 "쉬운"방법이 있습니까?

(나는 알 수없는 접두사가 있지만 기본적으로 알려진 "이름"을 가진 명령을 찾기 위해 출력을 grep으로 파이프하려고합니다. bash의 자동 완성 / 탭이 본질적으로 쓸모없는 경우입니다. 완전한 기능 "...)


예를 들어 줄 수 있습니까? 어떻게 ls -la다릅니 까?
John Siu

"ls -la"/ "ls -a"는 현재 디렉토리 (pwd)의 파일 만 나열합니다. PATH에 포함 된 모든 디렉토리의 모든 (실행 파일) 파일을 나열하고 싶습니다.
sme

답변:


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. 

좋아, 이것은 내가 찾던 것입니다. 현재 디렉토리에 실행 가능한 바이너리도 포함되어 있습니다. 감사.
sme

bash에서 잘 작동합니다.
엠마누엘 버그

수행하지 않고 이들 각각의 경로를 나열하는 방법이 which $(compgen -A function -abck)있습니까?
h3rrmiller

더 나은 대안을 찾지 못했습니다.
Nykakin

3

다음은 디렉토리의 내용을 나열하는 함수입니다 $PATH. 인수가 전달되면 함수는 이름이 인수 중 하나를 포함하는 명령 만 나열합니다. 인수는 glob 패턴으로 해석됩니다.

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
}

많은 것들과 마찬가지로, 이것은 zsh에서 더 쉽습니다.

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

매개 변수 확장^문자 는 배열과 연결된 텍스트가 각 배열 요소에 추가되도록합니다 (예 : prints) . 만화책 모욕처럼 보이지만 실제로는 일반 문자 , 와일드 카드 , 특수 매개 변수 (위치 매개 변수 배열) 및 수정자를 사용합니다 . 는 IS 글로브 규정 에 의해 다음에 일치하는 항목이없는 경우 빈 확장을 얻기 위해 역사 수정 각 경기의 기본 이름 ( "꼬리")를 유지합니다.path=(/bin /usr/bin); echo $^path/foo/bin/foo /usr/bin/foo
/*$^@*/*$@^*
(N:t) N t

더 비밀스럽고 외부 전화를 피하지만 이것은 단지 관심의 대상입니다.

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

실제로 apropos명령을 찾고있을 수 있습니다. 이 명령은 간단한 설명에 키워드가 포함 된 명령의 맨 페이지를 검색합니다. 제한 사항은 man 페이지가있는 명령 만 찾을 수 있다는 것입니다.


zsh 함수에서 두 번째 ^는 "인수 없음"호출에 대한 출력이없는 것 같습니다. 삭제하면 모든 키워드를 나열하고 단일 키워드를 검색 할 수 있습니다 (단, 키워드 목록은 아님). 는 (Non:t)별표가 확대되어야한다고 말하는 것 같다? 마지막으로 알아낼 수 없었습니다.
엠마누엘 버그

@EmanuelBerg 맞아, 고마워. 라인 노이즈에 대한 설명을 추가했습니다.
Gilles 'SO- 악마 그만해'

봅시다. 만약 논증이 없다면, "그들"을 아무 것도 설정하지 않았습니다. 왜냐하면 거기에 무엇이 있었는지 (아직 없었을 때), 다음에했던 일이 여전히 혼란 스러웠습니까? 또한 소문자는 보지 못했지만 path쉘에서 실행하면 실제로 $ PATH이지만 대신 공백이 :있습니다. 나머지는 명백하다 :)
Emanuel Berg

@EmanuelBerg No : 인수가 없으면 인수 배열을 빈 문자열을 포함하는 단일 요소 배열로 설정합니다. 이런 식으로 인수가 없다는 것은 빈 문자열이 일치하는 모든 이름, 즉 모든 이름이 일치 함을 의미합니다. $pathzsh 기능입니다. 이는 묶인 매개 변수 이며, 업데이트 될 때 자동으로 업데이트되는 배열입니다 PATH.
Gilles 'SO- 악 그만해라'

아하, 이제 봤어! 와우, 그것은 정통이었습니다!
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" ; 
}

찾기는 다음과 일치합니다. "x"(실행 가능) 비트 세트가 하나 이상 있으며 디렉토리가 아닙니다.

정규식 목록과 함께 사용하십시오.

findinpath awk sed '\.sh$'

정규 표현식 "." 모든 것을 보여줄 것이다
올리비에 Dulac

일반 IFS를 사용하면 $ PATH에서 다음 항목을 사용하여 중복 항목을 찾을 수 있습니다.echo $PATH | tr ':' '\n' | sort | uniq -d
Olivier Dulac

1
나는 모든 대답에 대한 코드를 시험해 보았는데 이것은 실제로 내가 찾은 것을 주었다 (PATH에서 주어진 명령의 모든 인스턴스에 대한 전체 경로).
Chris 페이지

나는 그것이 도움이 되었기 때문에 기쁘다 :)
Olivier Dulac

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

먼저 $PATHsed로 에코 하고 ":"을 ""로 바꿉니다.

그런 다음 rwx를 사용하여 파일을 찾아 에코하기 위해 각 항목을 찾습니다.

2> /dev/null그렇게되는 find오류가 인쇄되지 않습니다


3
a -maxdepth 1-type ffind에 필요하면 하위 디렉토리와 해당 파일 (PATH 검색이 수행하지 않는 파일)을 찾을 수 있습니다. 또한 귀하의 권한 테스트는 이상합니다 +x.
derobert

유효하지 않은 빈 항목이 '.'와 동일한 경우 (예 : :/bin또는)를 처리하지 않습니다 /bin::/usr/bin. 추가 시도 s/::/:.:/;s/^:/.:/;s/:$/:./받는 sed명령.
Arcege

실제로 find더 많은 경로를 검색 할 수 있으므로 루프없이 수행 할 수 있습니다. find $(echo $PATH | sed -e 's/\:/\ /g') -perm +rwx …물론 공백을 포함하는 디렉토리 이름은 경로를 엉망으로 만들지 만 루프 기반 경로는 동일한 문제가 있습니다.
manatwork

@manatwork 당신이 맞아요. 지금
바로이

미안하지만 아무것도 해결되지 않습니다. 문제는 단어 분할을 허용하기 위해 콜론을 공백으로 바꾸는 것입니다. 따라서 "/ foo bar : / fiz baz"를 "/ foo bar / fiz baz"로 변환 한 다음로 전달하십시오 for. 따라서 for4 단어 목록을 반복합니다. 단어 분할을 더 잘 조작하려면 IFS필요에 따라 다음을 설정하십시오 IFS=':'; find $PATH -perm +rwx ….
manatwork
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.