다음 명령을 사용하여 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 1
find가 /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
dash
shell 또는 plain 에서 sh
이 루프에 해당하는 것은 다음과 같습니다.
find /etc -name '*???' -exec sh -c '
for pathname do
# use "$pathname" to do something
done' sh {} +
관련된:
사용법에 grep
따르면 정규 표현식과 파일 이름 글로빙 패턴을 혼동하고 있는 것 같습니다. 정규식에서 점( .
)은 단일 문자 및 ?
해당 문자만 일치합니다 ?
(적어도 기본 정규식에서는 이것이 grep
기본적으로 사용됩니다).
$
파일 이름 패턴도 항상 고정되어 있으므로 정규식에서 as를 사용하여 패턴을 명시적으로 고정할 필요가 없습니다 (단, 패턴은 전체 파일 이름과 일치해야 하므로 xyz
해당 이름은 물론 *xyz
name match로 끝나는 모든 파일 과 정확히 일치합니다 xyz
). .
관련된:
답변3
find
다음을 사용하여 결과를 필터링 할 수 있습니다 .
find -type f | egrep '3$|4$|5$'