ls
bash 확장 와일드카드를 사용하면 출력에서 하나의 파일만 표시 할 수 없습니다 .
~에서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)
와 일치하는 foo
or 와 같은 패턴을 작성하는 데 유용합니다 bar
. @(foo|bar)-*.txt
match 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
.