나는 이것을 시도했지만 ls [a-z][a-z]
작동하지 않는 것 같습니다.
답변1
Bash를 사용하여 누락된 일치 항목으로 인해 오류가 발생하지 않도록 glob 설정을 설정합니다.
shopt -u failglob # avoid failure report (and discarding the whole line).
shopt -s nullglob # remove (erase) non-matching globs.
ls ?c c?
물음표는 단일 문자를 나타내는 전역 문자입니다. 두 문자의 파일 이름이 필요하므로 그 중 하나는 이어야 하며 c
첫 번째 문자이거나 마지막 문자입니다.
shopt -s dotglob
라는 메시지가 나타 납니다 .c
.
일치하는 파일이 없는 경우 이러한 셸 옵션을 설정하면 모든 매개변수가 제거되어 ls
기본적으로 모든 항목이 나열됩니다.
대신 이것을 사용하십시오:
shopt -s nullglob ## drop any missing globs
set -- ?c c? ## populate the $@ array with (any) matches
if [ $# -gt 0 ] ## if there are some, list them
ls -d "$@"
fi
답변2
더 좋은 방법은 다음을 사용하는 것입니다 find
.
find . -type f -name '*c*' -name '??'
그러면 재귀적으로 검색됩니다. 현재 디렉터리의 파일만 나열합니다.
find . ! -name . -prune -type f -name '*c*' -name '??'
답변3
파일이 존재하는 경우(예: 이스케이프 문자가 없는 경우 \c
) glob을 사용할 수 있습니다.
echo ?c c?
?
문자( ) 뒤에 문자가 포함된 파일 c
또는 c
문자 뒤에 문자( )가 포함된 파일을 일치시킵니다 ?
.
하지만 파일에서는 실패합니다.이름대시(예: -n
or or ) 로 시작 -e
하고 백슬래시 문자(예: \c
or \n
with echo
둘 다) 로 시작 -e
하며 -n
(일부 쉘)에 특별하며 echo
or \c
는 \n
이스케이프 시퀀스로 해석됩니다( \c
출력을 끝내고 대신 새 줄 인쇄). 일부 쉘 구현 (echo 및 bash) 에서 옵션을 \n
설정할 때 사용되는 축어적 문자입니다 . 다른 응용 프로그램이나 유틸리티(예: )에는 몇 가지 다른 옵션이 있으며 시작 부분에 다른 많은 대시가 있거나 파일 이름의 다른 이스케이프 문자를 해석하지 못할 수 있습니다.\n
shopt -s xpg_echo
ls
cc
두 번 이름이 지정된 파일 도 나열됩니다 .
파일이 대시(예: -n)로 시작하는 경우 다음을 사용하십시오.
$ ls -d -- ?n -n
또는 더 나은:
$ ls -d ./?n ./-n
지침
글로벌 매칭을 위한 파일이 없습니다.
파일이 존재하지 않으면 glob이 확장되지 않고 glob이 원래 형식으로 인쇄됩니다.
$ echo ?m m? ?m m?
zsh를 제외하고.
$ zsh -c 'echo ?m m?' zsh:1: no matches found: ./m?
쉘은 오류와 함께 종료됩니다.
이 동작은 다음으로 인해 발생합니다.지쉬의nomatch
옵션.$ zsh -c 'setopt +o nomatch; echo ?m m?' ?m m?
또는:
$ zsh -c 'echo ?m(N) m?(N)' ?m m?
그러나 이것은
mm
두 번 인쇄됩니다.failglob
Bash에서 shell 옵션이 설정되면 zsh와 유사한 결과를 얻을 수 있습니다.$ bash -c 'shopt -s failglob; echo ?m m?' bash: no match: ?m
그러나 스크립트는 중지되지 않으며 쉘도 종료되지 않습니다. 기술적으로 말하면 glob을 사용하는 줄은 더 이상 실행되지 않지만 다음 스크립트 줄에서 실행이 계속됩니다.
nullglob
Bash에서는 일치하지 않는 글로브를 제거하는 옵션을 설정할 수 있습니다 .$ bash -c 'shopt -s nullglob; echo ?m m? done' done
ls 사용(다른 프로그램과 유사)
파일 일치에는 문제가 없지만 디렉터리도 일치(및 나열)합니다.
$ ls ?c c? bc cz sc ac: hjk
-d
와 함께 사용하는 것이 더 좋습니다ls
(디렉토리는 포함되지만 확장되지는 않습니다).$ ls -d ?c c? ac bc cz sc
Glob은 파일(또는 디렉터리)과 일치할 수 없습니다.
그런 다음
ls
실패를 보고합니다.$ ls ?m m? ls: cannot access '?m': No such file or directory
다른 프로그램에서는 (아마도) 이 작업을 수행할 수 있습니다.아니요유사한 검사를 수행하십시오.
Bash와 함께 사용하면
nullglob
ls에 빈 목록이 제공되므로 방금 실행한 것처럼 내용이나 비밀번호가 나열됩니다ls
.$ ls ?m m? ac a.out cz 3 b sc ab bc
이렇게 하면 사용이 방지됩니다.
./
$ ls -d ./?m ./m? ls: cannot access './?m': No such file or directory ls: cannot access './m?': No such file or directory
또는 정규식 찾기를 사용할 수 있습니다(단, prune
누락된 하위 디렉터리를 탐색합니다)(이렇게 하면 cc라는 파일이 중복되지 않습니다).
$ find . ! -name . -prune -regex '.*/\(.c\|c.\)'
./ac
./cc
./sc
./bc
./cz
답변4
존재하다 bash
:
뒤에
c
문자(?c
) 또는 문자(.
)dotglob
뒤에c
(?c
)가 옵니다.shopt -s extglob failglob dotglob printf '%s\n' @(?c|c?)
c
( )를 포함하지 않거나!(*c*)
두 글자 ( )가 아닌!(??)
파일을 제외한 모든 파일 . 여기서는 결합을 이루기 위해 이중 부정이 사용됩니다.shopt -s extglob failglob dotglob printf '%s\n' !(!(*c*)|!(??))
존재하다 zsh
:
printf '%s\n' (?c|c?)(D)
(여기서
D
활성화됨dotglob
;failglob
(nomatch
호출됨zsh
)은 기본적으로 활성화되어 있습니다).이중 부정의 사용
~
와는 별개로연산자 및^
음수 스프레드 연산자:set -o extendedglob printf '%s\n' *c*~^??(D)
존재하다 ksh93
:
ksh93에는
nomatch
/ 옵션이 없지만failglob
수동으로 수행할 수 있습니다.FIGNORE='@(.|..)' # only ignore . and .. and not the other dotfiles files=(~(N)@(?c|c?)) if ((${#files[@]})); then printf '%s\n' "${files[@]}" else echo >&2 No match exit 1 fi
( 이 전역이
~(N)
활성화된 경우nullglob
)ksh93
실제로 결합 연산자가 있습니다. 따라서 여기서files=(...)
줄을 다음과 같이 변경할 수도 있습니다.files=(~(N)@(*c*&??))