Bash 확장 와일드카드

Bash 확장 와일드카드

lsbash 확장 와일드카드를 사용하면 출력에서 ​​하나의 파일만 표시 할 수 없습니다 .

~에서info bash

  If the `extglob' shell option is enabled using the `shopt' builtin,
several extended pattern matching operators are recognized.  In the
following description, a PATTERN-LIST is a list of one or more patterns
separated by a `|'.  Composite patterns may be formed using one or more
of the following sub-patterns:

`?(PATTERN-LIST)'
     Matches zero or one occurrence of the given patterns.

`*(PATTERN-LIST)'
     Matches zero or more occurrences of the given patterns.

`+(PATTERN-LIST)'
     Matches one or more occurrences of the given patterns.

`@(PATTERN-LIST)'
     Matches exactly one of the given patterns.

`!(PATTERN-LIST)'
     Matches anything except one of the given patterns.

.

shops -s extglob

ls -l /boot/@(vmlinuz*)
-rw-r--r--  1 root root 1829516 Apr 21  2009 /boot/vmlinuz-2.6.9-89.EL
-rw-r--r--  1 root root 1700492 Apr 21  2009 /boot/vmlinuz-2.6.9-89.ELsmp

ls -l /boot/?(vmlinuz*)
-rw-r--r--  1 root root 1829516 Apr 21  2009 /boot/vmlinuz-2.6.9-89.EL
-rw-r--r--  1 root root 1700492 Apr 21  2009 /boot/vmlinuz-2.6.9-89.ELsmp

하나의 파일만 표시하는 방법은 무엇입니까?

답변1

Bash에는 여러 일치 항목 중 하나만 확장하는 기능이 없습니다.

패턴이 @(foo)하나만 일치합니다.발생하다사진 foo. 즉, 일치 foo하지만 일치하지 않습니다 foofoo. 이 구문 형식은 or @(foo|bar)와 일치하는 fooor 와 같은 패턴을 작성하는 데 유용합니다 bar. @(foo|bar)-*.txtmatch foo-hello.txt, foo-42.txt등과 bar-42.txt같은 더 긴 패턴의 일부로 사용할 수 있습니다.

여러 일치 항목 중 하나를 사용하려면 일치 항목을 배열에 넣고 해당 배열의 요소를 사용할 수 있습니다.

kernels=(vmlinuz*)
ls -l "${kernels[0]}"

일치 항목은 항상 사전순으로 정렬되므로 첫 번째 일치 항목이 사전순으로 인쇄됩니다.

패턴이 어떤 파일과도 일치하지 않으면 변경되지 않은 패턴인 단일 요소를 포함하는 배열을 얻게 됩니다.

$ a=(doesnotmatchanything*)
$ ls -l "${a[0]}"
ls: cannot access doesnotmatchanything*: No such file or directory

nullglob빈 배열을 얻으려면 옵션을 설정하십시오 .

shopt -s nullglob
kernels=(vmlinuz*)
if ((${#kernels[@]} == 0)); then
  echo "No kernels here"
else
  echo "One of the ${#kernels[@]} kernels is ${kernels[0]}"
fi

Zsh에는 여기에 편리한 기능이 있습니다. 이것글로벌 예선 [NUM]패턴이 NUM번째 일치 항목으로만 확장됩니다. 이 변형은 NUM1번째 일치 항목부터 NUM2번째 일치 항목까지 확장됩니다(1부터 시작).[NUM1,NUM2]

% ls -l vmlinuz*([1])
lrwxrwxrwx 1 root root 26 Nov 15 21:12 vmlinuz -> vmlinuz-3.16-0.bpo.3-amd64
% ls -l nosuchfilehere*([1])
zsh: no matches found: nosuchfilehere*([1])

일치하는 파일이 없으면 glob 한정자로 N인해 패턴이 빈 목록으로 확장됩니다.

kernels=(vmlinuz*(N))
if ((#kernels)); then
  ls -l $kernels
else
  echo "No kernels here"
fi

glob 한정자는 om이름(수정 시간의 경우)이 아닌 나이를 기준으로 m일치 항목을 정렬합니다 Om. 따라서 vmlinuz*(om[1])최신 커널 파일로 확장하십시오.

답변2

"게임"은 당신이 생각하는 의미를 의미하지 않습니다. 그 뜻은패턴 내 일치, 파일을 반환하는 대신. ls그러한 옵션은 없습니다. 보통 사람들은 비슷한 일을 합니다 ls |head -1.

관련 정보