ls에 앵커 ^$를 사용할 수 있나요?

ls에 앵커 ^$를 사용할 수 있나요?

앵커는 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.cd.ce.hls *.c쉘을 통해ls a.c b.c d.c(이 경우) 이렇게 입력하면 ls4개의 인수가 제공됩니다. 첫 번째(인덱스 0)는 ls, 두 번째(인덱스 1)는 a.c 등..., 네 번째 ( 인덱스 3)는 입니다 d.c. 그래서 ls프로그램은본 적이 없다 *.c껍질은실행(2)- 4개의 매개변수로 처리합니다. 쉘에 의해 수행되는 프로그램 매개변수 확장을 호출합니다.와일드카드. 읽다글로벌(7)그리고 이해하다IFS쉘 변수.

(어떤 경우에는 주의하세요.시작하다귀하와 같은 파일은 다음과 같이 $HOME/.bashrc정의될 수 있습니다 .ls별명; 그런 다음 이 범주 이름 확장을 피하기 위해 or 또는 ls로 바꾸십시오(후자의 두 개는 다음과 같이 재정의를 우회하는 데에도 사용할 수 있습니다).\lscommand ls/bin/lsls기능))

확장으로 인해 무슨 일이 일어나는지 이해하는 데 매우 유용한 방법은 먼저 다음을 사용하는 것입니다.자동 완성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-0xargs

답변4

정규식 "with"를 사용할 수 있지만 ls에 전달해야 합니다 grep.

ls | grep ^cat | xargs -r ls -l

Bash는 절과 루프가 =~필요한 비교 연산자를 통해서만 정규식을 지원합니다 .iffor

for x in *; do if [[ "$x" =~ ^cat ]]; then ls -l "$x"; fi; done

관련 정보