나는 이 명령을 사용하여 ls -p | egrep "\<[A-Z]+\>"
디렉토리 이름에 /가 추가된 모든 대문자 파일과 디렉토리 이름을 인쇄하려고 합니다. 파일/디렉터리 이름을 모두 대문자로 grep하도록 했는데도 내 명령이 작동하는 이유를 이해할 수 없습니다. 올바른 출력을 얻었지만 grep이 XXX/와 같은 디렉토리를 나열할 수 있는 방법을 이해하지 못합니다.
답변1
귀하의 질문은 " 대문자( )가 아닌 문자가 있어도 DIRNAME/
확장 정규식과 일치하는 이유는 무엇입니까 ?"입니다.\<[A-Z]+\>
/
귀하의 정규식은 다음을 포함하는 모든 항목과 일치합니다.단어모두 대문자:
$ printf '%s\n' "this is not matched" "this IS matched" | egrep "\<[A-Z]+\>"
this IS matched
너비가 0인 "단어 경계", 즉 "단어 문자"와 해당 유형이 아닌 문자(또는 줄의 시작/끝) 사이의 공백과 일치합니다 \<
. \>
단어 문자는 클래스의 모든 문자 [[:alpha:]_]
(문자 및 밑줄)입니다.
DIRNAME/
귀하의 표현은 이후 와 일치하는 것과 일치합니다 ( DIRNAME
앞 과 뒤에 D
단어 경계가 있음 E
).
디렉토리 목록에서 특정 이름을 필터링하려면 grep
기타 줄 기반 텍스트 조작 도구를 사용하지 마십시오. 파일 이름에는 개행 문자가 포함될 수 있으므로 파일 이름에 제한을 두지 않는 한 줄 기반 도구는 올바른 작업을 수행하는 데 어려움을 겪습니다.
대신 디렉토리에서 모든 대문자 이름을 얻으려면 다음을 수행하십시오 bash
.
$ ls -p -d *
DIR/ FILE TEST123 dir/ file test123
$ ls -p -d !(*[[:lower:]]*)
DIR/ FILE TEST123
이를 위해서는 shopt -s extglob
확장된 글로빙 모드를 활성화해야 합니다. 확장된 와일드카드 패턴은 !(*[[:lower:]]*)
소문자가 포함되지 않은 모든 항목과 일치합니다.
/
이 패턴은 디렉토리 이름에 무엇이 추가되는지 상관하지 않습니다 ls -p
. 패턴이 파일 이름과 일치하고 문자가 포함된 파일 이름이 없기 때문입니다 /
. 또한 스키마가 확장되었습니다.앞으로 ls
호출됩니다.
숫자가 포함된 이름도 지우려면 다음을 사용하세요.
$ ls -p -d !(*[[:lower:][:digit:]]*)
DIR/ FILE
(소문자나 숫자가 하나 이상 포함된 이름은 포함되지 않습니다.) 또는,
$ ls -p -d !(*[[:lower:]]*|*[[:digit:]]*)
DIR/ FILE
(단, 소문자 1개 이상 포함된 이름이나 숫자 1개 이상 포함된 이름은 포함되지 않습니다.)
답변2
문법은 다음을 \>
의미합니다.단어 끝에서 일치. 당신이 원하는 것은 아마도
ls | egrep "^[A-Z.]+$"
여기서는 ^
줄의 시작과 일치하고 $
줄의 끝과 일치합니다.
답변3
$ ls -p | egrep "[A-Z]+"
ABC
$ ls -p ???
ABC fif out
나에게 있어 행동을 변화시킨 것은 단어 경계 일치였습니다.
ls -p | egrep "\<[A-Z]+\>"
내 경우에는 출력이 제공되지 않습니다.
비교 ls -f |cat
하고 ls -p |cat
. 정규식을 수정하기 시작하면 다음과 같은 사실을 알게 될 것입니다. 사람들은 귀찮게 해서는 안 됩니다.이런 일: 결국 너무 복잡해서 이 작업을 수행하지 않는 것이 좋습니다.분석하다체계적으로 ls: ls 출력은 IE에서 작동하는 파일 목록이 아닌 단순한 "보고서"입니다. (같은스크린샷MS Windows의 탐색기 창과 거의 같습니다. )
$ ls -p |cat
ABC
XYZ/
$ ls -f |cat
XYZ
ABC
순서도 다르지만 /
디렉터리를 필터링하는 데 슬래시를 사용하면 안 됩니다.
이와 같은 것이 필요하며 find . -type d
(모든 하위 디렉토리에도 디렉토리만 나열) 파일 시스템 검색을 위한 좋은 시작점이 있습니다.
$ find . -type d
.
./XYZ
./d3
./d3/d2
./d3/d1
./d2
./d1
귀하의 사양은 간단한 ls (아마도 grep 트릭을 사용함)와 깨끗한 솔루션 사이에 있습니다 find
. 나는 그 중 어느 것도 제공하지 않을 것입니다. 모든 것은 "원시" 파일 시스템 정보 나열에 관한 귀하의 성격과 향후 계획에 달려 있습니다.
이는 차이점을 보여줍니다.
$ find . -name "d1"
./d3/d1
./d1
$ ls -R |grep d1
d1
./d1:
d1
./d3/d1:
ls-grep을 사용하면 "추가" 줄과 문자를 얻을 수 있습니다. 필사적으로 쉘에서 상호 작용하십시오. 왜 안되겠습니까? (파일 "d1"이어딘가에)
그러나 스크립트로 작성된 모든 내용은 의존해야 하며 find
거기에는 많은 가능성이 있습니다. 파일 시스템을 데이터베이스로 전환합니다: 쿼리 및 보고: 두 단계. ls
명령줄의 빠른 올인원 도구입니다.
$ ls -p -d !(*[[:lower:]]*|*[[:digit:]]*)
정말 심각한가요? 그 외에도 전략적인 조언은 어떻습니까? 댓글 등을 참조하세요.
아, 그리고 모든 사용자가 상상할 수 있는 모든 라이너에 참여하고 싶을 수도 있습니다. 그래서바로크. 난 그래뿌리스타일.