".log.[모든 숫자]로 끝나는 모든 로그를 캡처하려고 합니다.
그래서 저는 이 구문을 만들었습니다.
find . -type f -regex '^.log.*[0-9]$' -print
command does not give any output
하지만 아래와 같은 파일은 캡쳐되지 않습니다. (예상 결과)
controller.log.2018-01-03-01
server.log.2017-10-31-03
server.log.2018-01-23-11
server.log.2018-04-06-17
server.log.2018-07-07-05
controller.log.2018-01-03-02
log-cleaner.log.10
server.log.2017-10-31-04
server.log.2018-01-23-12
server.log.2018-04-06-18
server.log.2018-07-07-06
controller.log.2018-01-03-03
log-cleaner.log.2
server.log.232.434
내 문법에 문제가 있는 걸까요?
답변1
-regex
(GNU 확장은 find
이제 일부 다른 구현에서도 인식되지만 상당한 차이가 있습니다.) -path
와일드카드 대신 정규식을 사용한다는 점을 제외하면 유사합니다. 이름뿐만 아니라 전체 파일 경로와 일치합니다.
따라서 .*\.log.*[0-9]
(필수 ^
는 아니지만 $
암시적임 find
) 일치하지만 캡처된 항목 도 -regex
일치합니다 ../dir/foo.log-3
./foo.logic/file.bz2
.*
ic/file.bz
-name
일치 파일이름와일드카드만 사용되지만 해당하는 정규 표현식은 없습니다. 여기서는 이름에 숫자가 포함되고 . .log
로 끝나는 파일에 대해서는 정규식이 필요하지 않습니다 .-name '*.foo*[0-9]'
정규식을 사용하여 동일한 작업을 수행할 수 있습니다 . 즉, 마지막 숫자 사이의 부분에 아무것도 포함되지 않도록 하여 파일 이름과만 일치하는지 -regex '.*\.log[^/]*[0-9]'
확인합니다 ..log
/
를 사용하면 특히 일부 BSD 또는 GNU 와 함께 사용하기 -regex
위해 확장 정규식을 활성화하는 경우 패턴을 추가로 지정할 수 있습니다 .-E
find
-regextype posix-extended
find
find . -regextype posix-extended -regex '.*\.log([.-][0-9]+)+' # GNU
find -E . -regex '.*\.log([.-][0-9]+)+' # BSD
이는 on .log
다음에 하나 이상의 .<number>
또는 가 오는 것과 일치합니다 -<number>
.
-regextype posix-extended
GNU가 없는 find
정규식 은이맥스정규식, 표준 기본 정규식과 표준 확장 정규식의 일부 혼합(지원되지만 그룹화가 대신 +
사용됨 )\(...\)
(...)
표준 기본 정규식인 -E
BSD 정규식 은 없습니다 .find
답변2
노력하다,
find . -type f -regex ".*\.log\..*[0-9]$"
./server.log.2018-01-23-12
./server.log.2018-07-07-06
./log-cleaner.log.2
./log-cleaner.log.10
./server.log.232.434
./server.log.2018-01-23-11
./server.log.2017-10-31-03
./controller.log.2018-01-03-01
./server.log.2018-04-06-17
./log-cleaner.log.1
./controller.log.2018-01-03-03
./server.log.2018-04-06-18
./controller.log.2018-01-03-02
./server.log.2018-07-07-05
./server.log.2017-10-31-04
- 우리는 탈출해야 해
.
답변3
"log" 뒤에 숫자만 오는 경우에도 다음이 작동할 수 있습니다 .
.-
find . -type f -regex ".*[.]log[-.0-9]*$"
답변4
다음을 사용하지 않고도 파일을 검색할 수 있습니다 non-GNU
find
.
find . -type f \
\( -name '?*.log.[0-9]' -o \
\( \
-name '?*.log.[0-9]*[0-9]' \
! -name '?*.log.?*[!0-9.-]*?' \
! -name '?*.log.?*[.-][.-]*?' \
\) \
\) \
-print;
이 기능은 캡처하는 파일 이름에 대해 여러 계층의 필터링을 수행하여 캡처 범위를 점차적으로 좁히고 원하는 파일 이름에 초점을 맞추는 것입니다. 정확하게 말하자면:
basename
경로가 다음으로 끝나는 파일을 즉시 선택합니다 . 즉, w/o.log.single_digit
- OTW, "this"로 끝나는 파일 이름을 선택하면
.log.
NUM
anything
NUM
네트워크에서 파일 이름을 캡처하는 경향이 설정됩니다. - 위 캡처에서는
non number, non dash, or non dot
파일 이름 부분에 이 포함된 파일이 거부됩니다.anything
숫자로 시작하고 끝나는 추세를 따라야 합니다. - 이제 캡처에는 이러한 파일이 모두 포함되어 있으며 그 중 일부에는 , 및
anything
만 포함되어 있습니다 . 마지막 제약 조건은 각각을 왼쪽과 오른쪽의 직접 이웃으로 가질 수도 있고 가질 수도 없습니다.digit(s)
dot(s)
dash(s)
dot
dash
- PS 이
-name
옵션은 파일 이름의 기본 이름 부분만 확인하며, -name
섹션은 이 기반으로 작동하므로wildcard
암시적으로 고정됩니다. 이는 일치하는 이름이 완전하다는 것을 의미합니다.