두 문자(그 중 하나는 c)가 포함된 파일 이름을 어떻게 표시합니까?

두 문자(그 중 하나는 c)가 포함된 파일 이름을 어떻게 표시합니까?

나는 이것을 시도했지만 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문자 뒤에 문자( )가 포함된 파일을 일치시킵니다 ?.

하지만 파일에서는 실패합니다.이름대시(예: -nor or ) 로 시작 -e하고 백슬래시 문자(예: \cor \nwith echo둘 다) 로 시작 -e하며 -n(일부 쉘)에 특별하며 echoor \c\n이스케이프 시퀀스로 해석됩니다( \c출력을 끝내고 대신 새 줄 인쇄). 일부 쉘 구현 (echo 및 bash) 에서 옵션을 \n설정할 때 사용되는 축어적 문자입니다 . 다른 응용 프로그램이나 유틸리티(예: )에는 몇 가지 다른 옵션이 있으며 시작 부분에 다른 많은 대시가 있거나 파일 이름의 다른 이스케이프 문자를 해석하지 못할 수 있습니다.\nshopt -s xpg_echols

cc두 번 이름이 지정된 파일 도 나열됩니다 .

  • 파일이 대시(예: -n)로 시작하는 경우 다음을 사용하십시오.

    $ ls -d -- ?n 
    -n 
    

    또는 더 나은:

    $ ls -d ./?n
    ./-n
    

지침

  • 글로벌 매칭을 위한 파일이 없습니다.

    1. 파일이 존재하지 않으면 glob이 확장되지 않고 glob이 원래 형식으로 인쇄됩니다.

      $ echo ?m m?
      ?m m?
      
    2. 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두 번 인쇄됩니다.

    3. failglobBash에서 shell 옵션이 설정되면 zsh와 유사한 결과를 얻을 수 있습니다.

      $ bash -c 'shopt -s failglob; echo ?m m?'
      bash: no match: ?m
      

      그러나 스크립트는 중지되지 않으며 쉘도 종료되지 않습니다. 기술적으로 말하면 glob을 사용하는 줄은 더 이상 실행되지 않지만 다음 스크립트 줄에서 실행이 계속됩니다.

    4. nullglobBash에서는 일치하지 않는 글로브를 제거하는 옵션을 설정할 수 있습니다 .

      $ bash -c 'shopt -s nullglob; echo ?m m? done'
      done
      
  • ls 사용(다른 프로그램과 유사)

    1. 파일 일치에는 문제가 없지만 디렉터리도 일치(및 나열)합니다.

      $ ls ?c c?
      bc  cz  sc
      
      ac:
      hjk
      

      -d와 함께 사용하는 것이 더 좋습니다 ls(디렉토리는 포함되지만 확장되지는 않습니다).

      $ ls -d ?c c?
      ac bc cz sc
      
    2. Glob은 파일(또는 디렉터리)과 일치할 수 없습니다.

      그런 다음 ls실패를 보고합니다.

      $ ls ?m m?
      ls: cannot access '?m': No such file or directory
      

      다른 프로그램에서는 (아마도) 이 작업을 수행할 수 있습니다.아니요유사한 검사를 수행하십시오.

    3. Bash와 함께 사용하면 nullglobls에 빈 목록이 제공되므로 방금 실행한 것처럼 내용이나 비밀번호가 나열됩니다 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*&??))
    

관련 정보