앵커는 grep에서만 사용할 수 있습니까, 아니면 다른 명령과 함께 사용할 수 있습니까?
예를 들어:
ls -l ^cat
답변1
정규식 앵커(예: ^
및 )는 $
다음 도구로만 구문 분석됩니다.구현하다자주 사용되는 표현. ls
그런 도구가 아니기 때문에 사용할 수 없습니다. 그러나 셸에서 호출된 모든 바이너리는 더 간단하지만 덜 강력한 와일드카드 기반 검색 메커니즘인 셸 와일드카드를 사용할 수 있습니다.
예를 들어, 이름이 cat으로 시작하는 모든 파일 목록의 경우:
$ ls cat* # lists all files with names which start with 'cat'
$ ls *dog # lists all files with names which end with 'dog'
$ ls d*y # Lists all files which names which start with 'd' and end
with 'y', e. g. 'donkey'
$ ls p?g # Lists all files which start with 'p', have one additional
character, and end with 'g', e. g. 'pig' and 'pug'
와일드카드의 경우 *
"0개 이상의 문자"를 의미하고 ?
"정확히 1개의 문자"를 의미합니다.
답변2
이 /bin/ls
프로그램은 다른 프로그램과 마찬가지로 패턴을 다루지 않습니다 *
.와일드카드에 의해유닉스 쉘, 실행 중인 프로그램이 아닌 설명하겠습니다.
이 ls
프로그램(여러 가지 구현이 있음)무료 소프트웨어, GNU에서처럼핵심 도구패키지이므로 자유롭게 소스 코드를 연구해 보세요.)얻다문자열 시퀀스(두 번째 매개변수)그것은 main
기능)이확장하다쉘을 통해 (종종 bash
). 이는 구체적이지 않으며 ls
쉘에서 실행되는 모든 프로그램에 해당됩니다(보통길).
예를 들어 , a.c
, , 파일이 포함된 디렉터리에서 이 명령은 확장됩니다 a.o
.b.c
d.c
e.h
ls *.c
쉘을 통해ls a.c b.c d.c
(이 경우) 이렇게 입력하면 ls
4개의 인수가 제공됩니다. 첫 번째(인덱스 0)는 ls
, 두 번째(인덱스 1)는 a.c
등..., 네 번째 ( 인덱스 3)는 입니다 d.c
. 그래서 ls
프로그램은본 적이 없다 *.c
껍질은실행(2)- 4개의 매개변수로 처리합니다. 쉘에 의해 수행되는 프로그램 매개변수 확장을 호출합니다.와일드카드. 읽다글로벌(7)그리고 이해하다IFS
쉘 변수.
(어떤 경우에는 주의하세요.시작하다귀하와 같은 파일은 다음과 같이 $HOME/.bashrc
정의될 수 있습니다 .ls
별명; 그런 다음 이 범주 이름 확장을 피하기 위해 or 또는 ls
로 바꾸십시오(후자의 두 개는 다음과 같이 재정의를 우회하는 데에도 사용할 수 있습니다).\ls
command ls
/bin/ls
ls
기능))
확장으로 인해 무슨 일이 일어나는지 이해하는 데 매우 유용한 방법은 먼저 다음을 사용하는 것입니다.자동 완성shell(예: TAB키 사용)을 실행하거나 명령(귀하의 경우 ls
)을 echo
.
그렇다면 당신이 정말로 원하는 것은확장된 와일드카드가 있는 쉘. 여러 가지를 찾을 수 있으며 이를 수행하기 위해 자신만의 쉘을 작성할 수 있습니다.
서쪽매우 다양한 확장이 있습니다(Scheme에서 코딩할 수 있음).
기존 셸(대부분은 무료 소프트웨어이며 소스 코드를 연구할 수 있음)을 필요에 맞게 조정하거나 직접 작성하세요.
앞으로,sash
매우 간단하고 작은 쉘(약간의 버그가 있음)이며 소스 코드는 읽기 쉽습니다.
Posix 쉘과 유사세게 때리다, - 및 기타, 예:물고기- 당신은 그것을 사용할 수 있습니다명령 대체, 예를 들어 다음을 사용하여찾기(1)(심지어 일부ls
관로some 에 넣는 grep
것은 ls -l $(ls | grep '^foo')
약간 쓸모가 없으며 공백이나 개행 문자가 있는 파일 이름과 같은 일부 경우에는 작동하지 않습니다. 왜냐하면 ls -l foo*
)와 동일하기 때문입니다.
일부 명령은 특정 명령과 함께 와일드카드로 표시됩니다(일반적으로선두) 매개변수 또는 데이터(예:찾기(1);예를 들어 다음과 같은 프로그램을 작성할 수 있습니다.글로벌(3)또는단어 표현(3). 그런데, 정규 표현식을 사용할 수 있습니다(제공:정규식(1)등...) 또한 프로그램에서정규식(3)기능.
자신만의 쉘을 작성하는 것은 매우 흥미로운 작업이므로 시도해 보시기를 적극 권장합니다. 사용법을 배워야 합니다.시스템 호출(2), 예를 들어 책을 읽음으로써.고급 Linux 프로그래밍, 자신만의 와일드카드를 구현하세요. 이해하고 (트랙(1)) 무엇시스템 호출일부 쉘로 수행하는 것도 가치가 있습니다.
실제로 ls ^cat
이름이 귀하로 시작하는 모든 파일을 나열한다는 의미 라면 쉘에 명령을 입력하기 cat
만 하면 됩니다 .ls cat*
그건 그렇고, 나는 zsh
내 것을 정말 좋아합니다인터렉티브shell (IMHO 자동 완성 기능이 더 잘 작동하고 확장 확장 기능이 정말 유용하기 때문입니다), 그건 취향의 문제이므로 YMMV입니다. 하지만 시도해 볼 수는 있습니다(이를 채택하는 경우 다음을 사용하여 로그인 셸을 변경하세요).chsh(1)).
마지막으로, 자신의 파일 이름에 공백(줄 바꿈, 제어 문자 및 대부분의 구두점 포함)을 피하는 것이 좋습니다. 따라서 라틴 문자와 숫자, 점 .
, 퍼센트 기호 %
, 밑줄 _
, 더하기 기호 +
, 시작하지 않는 대시 -
또는 물결표 만 사용하세요 ~
. .) 그러나 다른 사람이 일반적으로 사용하기 위해 쉘 스크립트를 작성할 때는 공백과 이상한 문자가 포함된 파일 이름을 고려하십시오.사용"$@"
이와 같은 스크립트에서는 더욱 좋습니다.
추신. 소문에 따르면 Windows에서는(모르겠어요) 상황이 다르며 와일드카드는 일부 시작 코드에 의해 수행됩니다.crt0아니면 당신은 main
읽을 수 있습니다.운영 체제: 세 가지 간단한 부분더 넓은 시각을 얻기 위해서다.
답변3
다른 사람들이 설명했듯이 ls
정규식 지원은 제공되지 않습니다. 그러나 find
아래와 같이 GNU 특정 정규식과 일치하는 파일을 나열하는 것이 가능합니다 .
먼저 다음 ls
작업을 사용할 수 있습니다.
find * -maxdepth 0 -regex "ANY_REGEX" -ls
또한 이 -exec
작업을 사용하면 모든 명령을 사용할 수 있습니다.
find * -maxdepth 0 -regex "ANY_REGEX" -exec ls -la {} \+
find
마지막으로 이를 와 결합 할 수 있습니다 xargs
. 예를 들면 다음과 같습니다.
find * -regex "ANY_REGEX" -print0 | xargs -0 ls -la
기본적으로 find
모든 하위 디렉터리가 검색되므로 동작을 복제하기 위해 ls
필터를 추가했습니다 -maxdepth 0
.
이전 예의 작업과 옵션은 공백이 포함된 파일 이름을 처리하는 데 -print0
필요합니다 . 이 점을 지적해주신 @ilkkachu에게 감사드립니다.find
-0
xargs
답변4
정규식 "with"를 사용할 수 있지만 ls
에 전달해야 합니다 grep
.
ls | grep ^cat | xargs -r ls -l
Bash는 절과 루프가 =~
필요한 비교 연산자를 통해서만 정규식을 지원합니다 .if
for
for x in *; do if [[ "$x" =~ ^cat ]]; then ls -l "$x"; fi; done