이름으로 시작하는 디렉토리를 find
나열하는 명령을 작성하려고 하는데 대소문자를 구분 하지 않아야 합니다 (rhel v7). 이를 수행할 수 있는 방법이 있습니까?/home
adm_
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
구현( find
RHEL의 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 1
FreeBSD와 더 비슷 -depth 1 -prune
하고 실제로 필요한 것에 더 가깝습니다(여기서 .
깊이 0()이 패턴과 일치하지 않기 때문에 제외되는 것을 원하지 않습니다)).