![와일드카드를 사용하여 Linux 명령을 찾는 방법은 무엇입니까? 및*[중복]](https://linux55.com/image/220730/%EC%99%80%EC%9D%BC%EB%93%9C%EC%B9%B4%EB%93%9C%EB%A5%BC%20%EC%82%AC%EC%9A%A9%ED%95%98%EC%97%AC%20Linux%20%EB%AA%85%EB%A0%B9%EC%9D%84%20%EC%B0%BE%EB%8A%94%20%EB%B0%A9%EB%B2%95%EC%9D%80%20%EB%AC%B4%EC%97%87%EC%9E%85%EB%8B%88%EA%B9%8C%3F%20%EB%B0%8F*%5B%EC%A4%91%EB%B3%B5%5D.png)
ls
내 Linux 컴퓨터에서는 다음으로 시작하는 명령을 찾을 수 있습니다.
$ ls<TAB-key>
나는이 결과를 얻습니다
ls lsb_release lscpu lshw lsipc lslogins lsmod lsof lspcmcia lss16toppm
lsattr lsblk lsdiff lsinitramfs lslocks lsmem lsns lspci lspgpot lsusb
이제 lsmod
다른 명령이 무엇인지 알고 싶습니다.
내가 아는 한 다음과 $ man lsmod
같은 다른 명령이 있습니다.
SEE ALSO
insmod(8), modprobe(8), modinfo(8) depmod(8)
mod string
하지만 터미널에서 사용할 명령을 찾을 수 없습니다와일드카드. 어떤 상황에서든 달성하는 방법을 안내해 주세요.유닉스와 리눅스디스트로
답변1
일부 쉘에는 이를 지원하는 기능이 내장되어 있습니다.
다루기 힘든
zsh
쉘의 자체 검사 내장 명령 중 다수는 -m
패턴 m
일치를 위한 인수를 사용합니다. 이것은 whence
다른 쉘 사용자(csh 사용자와 동일, (표준) SysV 쉘 사용자)의 편의를 위해 제공되는 명령 및 변형을 식별하고 내부 해시를 조작하기 위한 경우(ksh에서 복사 및 확장)입니다. which
표준 내장 명령 표 , 명령 경로 테이블을 포함합니다.whence -c
type
whence -v
hash
whence -m '*mod*'
type -m '*mod*'
which -m '*mod*'
hash -m '*mod*'
처음 3개는 내장 함수, 함수, 키워드 및 별칭도 표시합니다. for 와 같은 -p
명령에 대한 제한 사항을 추가합니다 .$PATH
hash
또는 다음을 사용하여 일치하는 실행 파일 $PATH
( $path
배열에 매핑됨)을 수동으로 찾을 수 있습니다.
print -rC1 -- $^path/*mod*(DN-*)
일부 내장 명령 외에도 zsh는 내부 검사(및 완료를 돕기 위해)를 위해 일부 특수 변수에 일부 내부 상태 및 캐시 데이터를 노출합니다. 예를 들어 명령의 해시 테이블과 해당 경로는 $commands
특수 연관 배열에 노출되므로 다음을 사용하여 해당 키를 볼 수 있습니다.
print -rC1 -- ${(kM)commands:#*mod*}
패턴 일치는 ${(M)array:#pattern}
연산자를 사용하여 수행됩니다.
여기에서 일반 완성 외에 와일드카드 일치를 시도하도록 완성 시스템을 구성할 수도 있습니다. 예를 들어, 최소한:
zstyle ':completion:*' completer _complete _match
autoload -Uz compinit
compinit
에 ~/.zshrc
다음을 입력하세요.
$ *mod*<Tab>
패턴과 일치하는 가능한 명령 목록이 표시됩니다. 하지만:
$ man -s1,8 *mod*<Tab>
Completing manual page
check-module mk_modmap
chmod modinfo
combine_lang_model modprobe
depmod perlmod
dh_gtkmodules perlmodinstall
[...]
파트 1(사용자 명령)과 파트 8(시스템 관리 명령)에 포함된 매뉴얼이 표시됩니다 mod
.
zsh
처음 실행하면 newuser
이 모든 항목을 조정할 수 있는 메뉴가 표시됩니다. 위 내용은 다음에서 확인할 수 있습니다.
(1) Continue to the main menu.
[...]
(2) Configure the new completion system. (Recommended.)
[...]
(2) Run the configuration tool (compinstall)
[...]
1. Completers: choose completion behaviour for tasks such as
approximation, spell-checking, expansion.
[...]
m. Set completers that modify the behaviour of the four main ones above.
[...]
1. _ignored: Use patterns that were previously ignored if no matches so far.
2. _list: Only list matches until the second time you hit TAB.
3. _oldlist: Keep matches generated by special completion functions.
4. (*) _match: If completion fails, retry with pattern matching.
5. _prefix: If completion fails, retry ignoring the part after the cursor.
위에서 4를 선택하세요. 하지만 더 많은 맛있는 음식이 있기 때문에 전체 메뉴를 살펴보는 것이 좋습니다.
세게 때리다
bash
셸 에서는 다음을 사용할 수 있습니다.
compgen -cX '!*mod*'
그것은 다음과 같습니다:
compgen -A command -X '!*mod*'
compgen -c
/는 패턴과 일치하는 명령을 제외하려는 의도로 compgen -A command
알려진 명령(키워드, 별칭, 내장 및 기능 포함) 목록을 제공 하지만 로 시작하는 패턴은 제외에서 포함으로 변경됩니다.-X
!
rc 및 파생 상품
에서 목록 rc
은 csh 또는 zsh와 같은 $path
환경 변수와 연결됩니다 .$PATH
ls -d -- $path/*mod* >[2] /dev/null
s 또는 glob 한정자 rc
와 동등한 것이 없으므로 목록 은 실행 파일로 제한되지 않으며 숨겨진 파일도 포함하지 않습니다.zsh
D
-*
rc
Bourne 쉘 및 대부분의 파생 제품과 공유되는 버그 기능은 일치하지 않는 glob 패턴이 그대로 남아 있다는 것입니다. 따라서 지정된 디렉토리에 일치하는 항목이 없으면 불평하는 /that/dir/*mod*
목록을 전달하여 이 문제를 해결합니다. 이름에 존재하지 않는 파일이 포함되어 있지만 ls
Bourne과 같은 쉘을 사용하여 이러한 오류를 삭제합니다.*
>[2] /dev/null
2> /dev/null
fish
물고기
와 유사하며 rc
실행 불가능에 대한 동일한 경고가 있지만 {.,}
패턴 접두사를 추가하여 숨겨진 파일 지원을 추가합니다.
printf '%s\n' $PATH/{,.}*mod*
POSIX sh
POSIX sh에서는 다음과 같은 함수를 정의할 수 있습니다.
find_commands() (
pattern=$1
IFS=:; set -o noglob
set -- $PATH''
IFS=; set +o noglob
for dir do
for file in "${dir:+$dir/}"$pattern "${dir:+$dir/}".$pattern; do
if [ -f "$file" ] && [ -x "$file" ]; then
printf '%s\n' "$file"
fi
done
done
)
다음과 같이 사용됩니다:
find_command '*mod*'
1 $PATH
빈 구성 요소가 있으면 제대로 작동하지 않습니다. PATH=/bin/:/usr/bin:
마지막 빈 구성 요소는 현재 작업 디렉터리를 찾는 것을 의미하기 때문입니다. 이 문제 는 빈 .${^path/#%/.}
문자열을 다른 쉘이 / 디렉토리를 수동으로 찾기 위해 아래 제공된 솔루션 에도 동일하게 적용됩니다..
$PATH
$PATH
$PATH
$path
답변2
# in at least bash
start cmd:> ( IFS=: ; find $PATH -type f -name 'ls*' -perm /111 -ls )
96723 4 lrwxrwxrwx 1 root root 4 Mär 19 23:08 /usr/bin/lsmod -> kmod
281915 4 lrwxrwxrwx 1 root root 11 Mär 19 22:35 /usr/bin/lsb-release -> lsb_release
733984 4 -rwxr-xr-x 1 root root 2479 Mär 20 05:53 /usr/bin/lss16toppm
734097 4 -rwxr-xr-x 1 root root 1821 Mär 19 22:36 /usr/bin/lsdev
955869 12 -rwxr-xr-x 1 root root 10514 Mär 19 22:35 /usr/bin/lsb_release
1070923 16 -rwxr-xr-x 1 root root 14215 Mär 20 00:13 /usr/bin/lsusb.py
1245610 136 -rwxr-xr-x 1 root root 138016 Apr 1 19:45 /usr/bin/ls
1254310 104 -rwxr-xr-x 1 root root 104632 Apr 1 21:16 /usr/bin/lscpu
1254311 76 -rwxr-xr-x 1 root root 73928 Apr 1 21:16 /usr/bin/lsfd
1254312 52 -rwxr-xr-x 1 root root 51384 Apr 1 21:16 /usr/bin/lsipc
1254313 28 -rwxr-xr-x 1 root root 26808 Apr 1 21:16 /usr/bin/lsirq
1254314 32 -rwxr-xr-x 1 root root 31304 Apr 1 21:16 /usr/bin/lslocks
1254315 40 -rwxr-xr-x 1 root root 39096 Apr 1 21:16 /usr/bin/lsmem
1254316 40 -rwxr-xr-x 1 root root 39096 Apr 1 21:16 /usr/bin/lsns
1254878 136 -rwxr-xr-x 1 root root 137400 Apr 1 21:22 /usr/bin/lsblk
1254879 52 -rwxr-xr-x 1 root root 51384 Apr 1 21:22 /usr/bin/lslogins
1255279 84 -rwxr-xr-x 1 root root 85136 Mär 19 22:34 /usr/bin/lsscsi
1255280 176 -rwxr-xr-x 1 root root 179912 Mär 19 22:50 /usr/bin/lsof
1258862 2980 -rwxr-xr-x 1 root root 3048800 Mär 20 06:13 /usr/bin/lsar
1264433 16 -rwxr-xr-x 1 root root 14456 Mär 19 22:35 /usr/bin/lsattr
1264457 12 -rwxr-xr-x 1 root root 11989 Mär 20 04:18 /usr/bin/lsinitrd
1271261 104 -rwxr-xr-x 1 root root 106376 Mär 19 23:14 /usr/bin/lspci
1272752 252 -rwxr-xr-x 1 root root 256328 Mär 20 00:13 /usr/bin/lsusb
답변3
매뉴얼 페이지를 검색하려면 (많은 구현과 마찬가지로 apropos
) 모든 매뉴얼 페이지 및 해당 요약의 색인에 대해 일부 정규식 일치를 수행하는 방법을 사용할 수 있습니다.man -k
man
apropos
다음에서 사용 mandb
(Linux 기반 시스템에서 일반적),
apropos mod
이름이나 요약이 정규식과 일치하는 매뉴얼 페이지 항목을 반환합니다 mod
(이것은 쉘 glob 와일드카드 패턴과 다릅니다). 즉, mod
.
보려는 섹션이나 섹션 목록을 지정할 수도 있습니다.
초록이 아닌 이름에서만 찾으려면 mod
페이지 이름에는 공백이 거의 포함되지 않지만 초록에는 거의 항상 공백이 포함된다는 사실을 활용할 수 있습니다.
그래서:
apropos -s1,8 '^[^ ]*mod[^ ]*$'
섹션 1과 8의 매뉴얼 페이지를 반환해야 합니다.이름mod
포함합니다 . 정규식은 제목( )의 시작, ^
공백( )을 제외한 모든 숫자( ) 문자, 공백( )을 제외한 모든 숫자( ) 문자, 제목의 끝( ) 과 일치하기 때문에 포함합니다 . 한마디로 주변에 공간이 없습니다.*
[^ ]
mod
*
[^ ]
$
mod