대소문자를 구분하지 않고 디렉토리 찾기

대소문자를 구분하지 않고 디렉토리 찾기

이름으로 시작하는 디렉토리를 find나열하는 명령을 작성하려고 하는데 대소문자를 구분 하지 않아야 합니다 (rhel v7). 이를 수행할 수 있는 방법이 있습니까?/homeadm_find

답변1

-iname옵션이 당신이 찾고 있는 것입니다.

find /home -iname 'adm_*'

-type d디렉터리에 대한 제한 사항을 추가합니다 .

find /home -iname 'adm_*' -type d

답변2

패턴과 일치하는 이름으로 수행하려는 작업에 따라 두 가지 방법으로 이 작업을 수행할 수 있습니다.

그냥 인쇄하고 싶다면 Linux 시스템에서 -iname대신 사용하세요 -name.find

find /home -type d -iname 'adm_*'

다음 용도로 사용하려면 find:

find /home -type d -iname 'adm_*' -exec sh -c '
    for dirpath do
        # use "$dirpath" here
    done' sh {} +

이렇게 하면 대소문자를 구분하지 않는 패턴 아래 또는 모든 디렉토리에 인라인 쉘 스크립트가 적용됩니다 /home.

검색을 재귀적으로만 제한하려는 경우 검색 경로 뒤(작업 /home전 )에 삽입할 수도 있습니다.-maxdepth 1

쉘에서 직접 사용할 수도 있습니다. 을 사용한다고 가정하고 쉘 옵션을 bash설정하십시오 .nocaseglob

shopt -s nocaseglob
printf '%s\n' /home/adm_*/

/home패턴과 일치하는 모든 디렉토리 경로 이름이 대소문자를 구분하지 않고 인쇄됩니다. 후행은 /디렉토리만 일치하도록 보장합니다.

하위 디렉터리 내에서도 검색하려면 옵션을 추가로 설정 globstar하고 다음을 사용하세요 **.

shopt -s nocaseglob globstar
printf '%s\n' /home/**/adm_*/

분명히 루프에서 직접 사용할 수 있습니다.

shopt -s nocaseglob globstar dotglob nullglob
for dirpath in /home/**/adm_*/; do
    # use "$dirpath" here
done

dotglob옵션을 사용하면 와일드카드 패턴이 숨겨진 이름과 일치하게 되고( find완료된 대로) nullglob일치하는 항목이 없으면 패턴이 완전히 제거됩니다.

답변3

find비표준 확장을 지원하지 않는 구현 의 경우 -iname다음을 사용할 수 있습니다.

find /home -name '[aA][dD][mM]_*' -type d

일부 find구현( findRHEL의 GNU 포함)의 경우 이름에 현재 로케일에서 유효한 문자를 형성하지 않는 바이트 시퀀스가 ​​포함된 파일은 포함되지 않습니다. 행위:

LC_ALL=C find /home -name '[aA][dD][mM]_*' -type d

C 로케일과 마찬가지로 모든 단일 바이트 값은 유효한 문자를 형성합니다. (그리고 a, A, d, D, m는 모두 이식 가능한 문자 집합의 일부이므로 일반적으로 해당 인코딩은 시스템의 모든 로케일에서 일정합니다 M. )_

GNU 표준과 동등한 경우 -maxdepth 1다음을 수행할 수 있습니다.

LC_ALL=C find /home/. ! -name . -prune -name '[aA][dD][mM]_*' -type d

(기술적으로 이것은 -mindepth 1 -maxdepth 1FreeBSD와 더 비슷 -depth 1 -prune하고 실제로 필요한 것에 더 가깝습니다(여기서 .깊이 0()이 패턴과 일치하지 않기 때문에 제외되는 것을 원하지 않습니다)).

관련 정보