대소문자를 구분하지 않는 디렉토리 검색?

대소문자를 구분하지 않는 디렉토리 검색?

여러 기존 폴더의 폴더 구조를 다시 작성하는 작업 중입니다. 따라서 누락된 폴더가 있으면 추가해야 합니다.

먼저 if 명령을 사용하여 디렉토리가 존재하는지 확인하고 존재하지 않으면 디렉토리를 생성하십시오. 대소문자 구분으로 인해 동일한 폴더를 다시 만들게 되었습니다.

예: ABC가 포함된 폴더가 이미 존재하지만 abc가 검사 중이므로 abc가 포함된 새 폴더를 다시 생성하고 때로는 Abc가 포함된 폴더가 존재하는 경우도 있습니다.

답변1

존재하다 bash:

shopt -s nullglob nocaseglob
set -- [a]bc/
if [ "$#" -gt 0 ]; then
    echo 'There is at least one directory called "abc" (case ignored):'
    printf '\t%s\n' "$@"
fi

두 가지 bash셸 옵션은 nullglob여기서 패턴과 일치하는 디렉터리가 있는지 nocaseglob테스트하는 데 사용됩니다(대소문자 구분 안 함). [a]bc/nullglob옵션을 사용하면 일치하는 항목이 없으면(그렇지 않으면 확장되지 않음) 패턴이 제거되고 nocaseglob패턴 일치에서 대소문자를 구분하지 않게 됩니다.

디렉토리와 일치하는 파일 이름을 호출하는 [a]bc/대신 사용합니다 . abc우리는 [a]쉘이 와일드카드를 수행하도록 강제합니다.모두이름과 일치하며, 뒤에 따라 /일치 항목을 디렉터리로만 제한합니다. 이를 인수로 사용하여 set위치 인수를 일치하는 디렉터리 이름으로 설정합니다. 그런 다음 에서 이를 찾을 수 $@있고 일치하는 수량을 에서 찾을 수 있습니다 $#.

시험:

$ mkdir abc aBc ABc   # create three directories with only case diffs in their names
$ touch abC           # ... and also a file

$ bash ./script.sh
There is at least one directory called "abc" (case ignored):
        ABc/
        aBc/
        abc/

답변2

바꾸다

if [ -d abc ] ; then
    echo 'Directory exists'

사용

if /bin/ls -d [aA][bB][cC]/ &> /dev/null ; then
    echo 'Directory exists'

답변3

zsh하나 이상의 파일이 다음에 속해 있는지 확인할 수 있습니다 .목차그리고 해당 이름은 abc다음에서 대소문자를 구분하지 않고 존재합니다.

set -o extendedglob # best in ~/.zshrc
if () { (($#)); } (#i)abc(/N); then
  echo such directories exist
fi

이것은 () { body; } args익명 함수( )를 호출하는 함수입니다. 여기서 본문은 (($#))인수의 개수가 0이 아닌지 확인하고 args는 대소 문자를 구분하지 않는 일치가 켜진 (#i)abc(/N)glob 확장의 결과입니다.(#i)(/N)글로벌 예선/파일 형식을 제한하는 것목차일치하는 항목이 없을 때 오류를 보고하는 대신 glob이 null로 확장되도록 N활성화됩니다 .nullglob

관련 정보