>

그래서 나는 파일 시스템을 가지고 놀았으며 /etc 에 파일을 나열하는 것에 대해 궁금해했다.  이름에는 대문자 만 포함되어 있습니다. 내가 명령했다

ls *[A-Z]*

그러나 콘솔은 낮은 문자를 포함하는 파일도 보여줍니다. ls 만 사용하고 싶습니다  명령. 콘솔 프로그램은 로케일에 의존합니까?

근본 원인은 무엇입니까?

  • 답변 # 1

    [A-Z]  대문자를 의미하지는 않습니다. 그것은 A 에서 편지를 의미   Z 로 소문자를 포함 할 수 있습니다. 일반적으로 [[:upper:]] 를 사용해야합니다  대신에. (이것은 extglob 없이 Bash에서 작동합니다. ))

    어떤 캐릭터 [A-Z]  일치하는 언어는 지역에 따라 다릅니다.

    전체 대문자로 구성된 파일 이름뿐만 아니라 대문자로 된 모든 파일 이름을 표시하고 싶지만 ls *[A-Z]* 를 사용하는 경우 대문자가없는 일부 파일 이름이

    있습니다.

    이것은 로케일의 사전 식 순서가 대문자와 소문자 (예 : AaBbCcDd ...)를 산재 할 때 발생합니다. 다른 로케일을 설정할 수 있지만 (예 : LC_ALL=C )에서 가장 좋은 해결책은 일반적으로 대문자와 특히 일치하는 패턴을 작성하는 것입니다.

    대문자 인 문자도 로케일마다 다를 수 있지만, 아마도 로케일의 대문자 인 경우 아마도 포함 시키려고합니다. 그것은 아마도 [[:upper:]] 의 장점 일 것입니다  단점보다는 오히려.

    [[:upper:]] 사용  대신 Bash와 같은 대부분의 Bourne 스타일 쉘은 globs에서 POSIX 문자 클래스를 지원합니다. 이 명령은 /etc 의 항목을 나열합니다.  이름에 대문자가 하나 이상 있습니다 :

    ls -d /etc/*[[:upper:]]*
    
    

    일부 항목은 디렉토리 일 수 있습니다. 디렉토리를 나열하지 않고 내용을 표시하려면 -d 를 제거하십시오.  깃발. 당신은 또한 -- 를 넣어 할 수 있습니다   /etc 에 항목이있는 경우 패턴 앞에 플래그  그 - 로 시작 . 그래도 그렇지 않을 것입니다. (스크립트에서 일반적으로 -- 를 사용하려고합니다.  여기 요.)

    도트 파일을 원하지는 않지만 원한다면 ...

    . 로 시작하는 항목은 표시되지 않습니다 . 보통 당신은 그것들을 보여주고 싶지 않습니다. 원하는 경우 대부분의 셸을 사용하면 일치하는 단일 글로브를 작성하거나 기본적으로 포함하도록 글 로빙을 구성 할 수 있습니다. Leading- . 를 자동으로 포함하는 옵션  Bash의 항목은 dotglob 입니다   shopt -s dotglob 로 활성화 할 수 있습니다 . 다른 껍질에 대해서는 . 아니면 단순히 두 번째 글로 쓸 수도 있습니다 :

    ls -d /etc/*[[:upper:]]* /etc/.*[[:upper:]]*
    
    

    가장 많이 사용되는 Bourne 스타일의 쉘은 괄호 확장을 지원하므로 반복을 줄이면서보다 간결하게 작성할 수 있습니다.

    ls -d /etc/{,.}*[[:upper:]]*
    
    

    Bash를 포함한 대부분의 쉘에서, 두 개의 분리 된 글롭을 작성할 때, 하나의 확장되지 않으면 오류 메시지가 나타납니다. 그러나 ls  다른 항목과 일치하는 항목이 계속 표시됩니다. 그러나 스테판 샤젤 라스 (Stéphane Chazelas)가 지적한 바와 같이, 매우 인기있는 Zsh를 포함한 일부 포탄에서는 전체 명령이 실패하고 ls  대화식으로 셸을 사용하는 경우 명령을 다시 실행할 수 있기 때문에 실제로 유해하지는 않지만 이러한 구성은 이식 가능한 스크립트에는 적합하지 않습니다. Wyzwyz를 설정하면 Bash도 이와 같이 작동합니다.  쉘 옵션.

    그것을 위해 확장 글로브가 필요하지 않습니다.

    Bash에서는 glob 패턴으로 POSIX 문자 클래스를 사용하기 위해 확장 globbing을 활성화 할 필요가 없습니다. Bash 4.3.48이 설치된 시스템에서 :

    failglob
    
    
    그러나 파일 이름은대문자로 일치해야합니다.

    해야 할확장 글로브가 필요한 것은대문자로 구성된 파일 이름을 일치시키려는 경우입니다. 그런 다음 ek@Io:~$ shopt extglob extglob off ek@Io:~$ ls -d /etc/*[[:upper:]]* /etc/ConsoleKit /etc/LatexMk /etc/ODBCDataSources /etc/UPower /etc/ImageMagick-6 /etc/NetworkManager /etc/rcS.d /etc/X11 를 사용하십시오.  또는 +([[:upper:]]) 확장 된 글로브입니다.

    Bash를 사용한다면,이 기사, GNU Bash 매뉴얼의 3.5.8.1 패턴 일치를 참조하십시오. Stéphane Chazelas의 답변도 참조하십시오.

  • 답변 # 2

    대문자만으로 구성된 파일 이름의 경우 (pyzwyz와 같은) *([[:upper:]]) FOO ;Wyzwyz와 달리 ÉTÉ  (어디 ΛΈΞΗ   FOO.BAR 로 작성  그 뒤에 급성 악센트를 결합한 U + 0301¹))

    ÉTÉ 와 함께  또는 É  또는 E :

    ksh
    
    
    zsh -o kshglob -o nobareglobqual 와 함께  ( bash -O extglob 보다 오히려 사용하고 싶습니다. ) :

    ls -d +([[:upper:]])
    
    

    또는 GNU zsh -o extendedglob 와 함께  (파일 이름에 유효한 문자 만 포함되어 있다고 가정) :

    kshglob
    
    

    또는 ls -d [[:upper:]]#   ls 대신  (여기서는 인수를 출력하므로 ls --ignore='*[^[:upper:]]*' 와 같은 옵션을 사용하고 싶을 것입니다  유용하기 위해) :

    find
    
    

    (와이즈 비즈)  유효하지 않은 문자를 포함하는 파일 이름을 필터링하는 것입니다.  필터링 할 수 없습니다 (일부 ls 사용)  적어도 구현))

    소문자가없는 파일 이름의 경우

    (그러나 여전히 -l 에서와 같이 문자가 아닌 것을 허용합니다. ), find . ! -name . -prune -name '*' ! -name '*[^[:upper:]]*' 와 함께 :

    -name '*'
    
    
    ! -name 와 함께  또는 find :

    ABC.TXT
    
    

    또는 ksh :

    (FIGNORE='@(.|..|*[[:lower:]]*)'; ls -d -- *)
    
    

    또는 GNU bash -O dotglob -O extglob 와 함께  (파일 이름에 유효한 문자 만 포함되어 있다고 가정) :

    zsh -o kshglob -o dotglob -o nobareglobqual
    
    

    (추가 ls -d -- !(*[[:lower:]]*)  나에게 버그처럼 보인다)

    zsh -o extendedglob 와 함께 :

    ls -d -- ^*[[:lower:]]*(D)
    

    (일부 ls 와 함께  유효한 문자가 소문자 인 경우에도 유효하지 않은 문자를 가진 파일 이름은 포함하지 않습니다.

    대문자가 하나 이상인 파일 이름 : (pyzwyz와 같은) ls -A --ignore='*[[:lower:]]*' --ignore='.*[[:lower:]]*' --ignore='.*[[:lower:]]*' 와 달리 find )

    find . ! -name . -prune -name '*' ! -name '*[[:lower:]]*' 와 함께  또는 find  (와이즈 비즈  이름이 Foo.bar 로 시작하는 파일을 포함하는 것 ) :

    .Été.txt
    
    
    123.6 와 함께 :

    foo.bar
    
    

    (일부 zsh -o dotglob 와 함께  유효한 문자 중 일부가 대문자 인 경우에도 유효하지 않은 문자가 포함 된 파일 이름을 포함하지 않습니다.

    <시간>

    ¹ bash -O dotglob 를 사용하여 문자 결합을 허용하려면 , 유니 코드 문자 속성을 사용하는 펄과 같은 정규식을 사용할 수 있습니다 :

    dotglob
    
    

  • 답변 # 3

    이전 답변을 알려주세요. 아직 커피가 없습니다.

    나는 단지 ls로 이것을하는 것에 대해 확신이 없다. 그러나 다음은 트릭을 수행해야하는 또 다른 grep입니다.

    ls | egrep ^ [^ a-z0-9] * $

  • 답변 # 4

    명령의 패턴은 적어도 하나의 대문자가 포함 된 모든 파일 이름과 일치합니다. .  또는 ls -d -- *[[:upper:]]*   find 때문에 일치합니다  대문자 앞뒤의 모든 것을 일치시킬 수 있습니다. 그렇기 때문에 이름에또한소문자가있는 파일도 얻을 수 있습니다.

    대문자 만있는 파일을 원하면 find . ! -name . -prune -name '*[[:upper:]]*' 가 필요합니다  와이즈 비즈 :

    find
    
    

    그런 다음

    zsh -o pcrematch
    
    

    로케일을 ls -d -- *(e@'[[ $REPLY =~ "^(?>\p{Lu}\pM*)*$" ]]'@) 로 설정해야 할 수도 있습니다.  또는 Foo 를 사용하십시오   bAr 대신

  • 답변 # 5

    왜 ls 만 사용하고 싶습니까? 대신 find를 사용하면됩니다.
    와이즈 비즈

    수정 :
    Wyzwyz에 따르면 :

    와이즈 비즈

    ls를 사용하려면 bash가 * 와 같은 방식으로 '*'를 번역하지 않는다는 것을 명심해야합니다.  또는 extglob . * [A-Z] *는 기본적으로 어떤 문자열이든 문자열 뒤에 모든 문자열과 일치하도록 시도합니다.

    bash

관련 자료

  • 이전 shell script - 변수 또는 bash 배열에서 사용자의 입력을 프롬프트하는 방법은 무엇입니까?
  • 다음 compiling - Ubuntu 1604 LTS 시스템에서 CentOS를 구축 할 수 있습니까?