3자로 끝나는 디렉터리나 파일 찾기

3자로 끝나는 디렉터리나 파일 찾기

다음 명령을 사용하여 3자로 끝나는 디렉터리나 파일을 찾으려고 합니다.

ls -l /etc | grep ???$

이건 안돼,,

3, 4, 5, 6, 7... 문자로 끝나는 파일의 디렉터리를 찾으려면 무엇을 입력해야 합니까?

답변1

find /etc -maxdepth 1 -regextype egrep  -regex '.*/.{3}$'

/etc/그러면 파일 또는 디렉터리 이름이 다음에서 검색됩니다.정확히3자 길이입니다.

find /etc -maxdepth 1 -regextype egrep  -regex '.*/.{3,}$'

/etc/그러면 다음에서 파일이나 디렉터리를 찾을 수 있습니다 .최저 한도에서3자 길이입니다.

find /etc -maxdepth 1 -regextype egrep  -regex '.*/.{3,7}$'

/etc그러면 3~7자 길이의 파일이나 디렉터리가 검색됩니다 .

-maxdepth 1find가 /etc의 하위 디렉토리를 검색하는 것을 방지합니다 .

일치하는 디렉터리만 제한하려면 를 사용하세요 -type d. -maxdepth 1일반 파일의 경우 -type f.

발견된 파일/디렉토리에 대해 작업을 수행하려는 경우 find의 -exec옵션을 사용할 수 있습니다. 예를 들어

find /etc -maxdepth 1 -regextype egrep  -regex '.*/.{3,7}$' -exec du -sch {} +

또는 xargs(그러나 파일 이름의 공백, 개행 등의 문제를 방지하려면 NUL 구분 기호를 사용하십시오). 이를 통해 이전에 파이프라인에서 NUL로 구분된 입력을 처리할 수 있는 모든 도구를 사용할 수 있습니다 xargs. 예를 들어:

find /etc -maxdepth 1 -regextype egrep  -regex '.*/.{3,7}$' -print0 | 
  head -z -n 10 |
  xargs -0r ls -ld

답변2

3개 이상의 문자를 포함하는(즉, 재귀적이지 않은) 단일 디렉토리의 이름을 나열하려면 임의의 와일드카드 패턴 또는 을 사용할 *??????*있습니다 *???*. 각각은 ?단일 문자와 일치하고, *각각은 임의 개수의 문자와 일치합니다.

/etc아래에 그러한 이름을 나열하려면 ls:

ls -ld /etc/*???

아니면 간단히 말해서,

printf '%s\n' /etc/*???

3으로 끝나는 이름을 나열하려면특정한문자(예 : )를 패턴 xyz으로 사용합니다 .*xyz

이러한 이름을 재귀적으로 검색하려면 (에서 bash) shopt -s globstar와일드카드 **모드를 활성화하고(하위 디렉터리와 재귀적으로 일치) 다음을 수행할 수 있습니다.

ls -ld /etc/**/*???

기본적으로 이 **모드는 셸에서 활성화되어 있습니다 zsh.

도착하다하다이러한 이름을 가진 것(단지 전화가 아닌)에 대해서는 ls루프를 사용하십시오.

shopt -s globstar
for pathname in /etc/**/*???; do
    # use "$pathname" to do something
done

dashshell 또는 plain 에서 sh이 루프에 해당하는 것은 다음과 같습니다.

find /etc -name '*???' -exec sh -c '
    for pathname do
        # use "$pathname" to do something
    done' sh {} +

관련된:


사용법에 grep따르면 정규 표현식과 파일 이름 글로빙 패턴을 혼동하고 있는 것 같습니다. 정규식에서 점( .)은 단일 문자 및 ?해당 문자만 일치합니다 ?(적어도 기본 정규식에서는 이것이 grep기본적으로 사용됩니다).

$파일 이름 패턴도 항상 고정되어 있으므로 정규식에서 as를 사용하여 패턴을 명시적으로 고정할 필요가 없습니다 (단, 패턴은 전체 파일 이름과 일치해야 하므로 xyz해당 이름은 물론 *xyzname match로 끝나는 모든 파일 과 정확히 일치합니다 xyz). .

관련된:

답변3

find다음을 사용하여 결과를 필터링 할 수 있습니다 .

find -type f | egrep '3$|4$|5$'

관련 정보