임의의 숫자로 끝나는 로그 파일 캡처

임의의 숫자로 끝나는 로그 파일 캡처

".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](필요하지 않거나 ^' s $로 암시적임 )는 on과 일치 하지만 , 캡처된 .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사용하여 확장 정규식을 활성화하는 경우 패턴을 지정할 수 있습니다 .-Efind-regextype posix-extendedfind

find . -regextype posix-extended -regex '.*\.log([.-][0-9]+)+' # GNU
find -E . -regex '.*\.log([.-][0-9]+)+' # BSD

여기서는 on .log다음에 하나 이상의 .<number>or 가 일치합니다 -<number>.

-regextype posix-extendedGNU find의 정규 표현식이 없으면이맥스regexps, 표준 기본 정규 표현식과 표준 확장 정규 표현식 사이의 일종의 하이브리드입니다( 지원 +하지만 그룹화는 \(...\)대신 을 사용함 (...)).

-EBSD 정규 표현식이 없으면 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즉, 경로가 없이 끝나는 파일을 즉시 선택하십시오..log.single_digit
  • OTW, 다음으로 끝나는 항목을 선택하세요. .log. NUM anything NUM이렇게 하면 파일 이름이 그물에 걸릴 경향이 설정됩니다.
  • 위의 캐치 중에서 파일 이름 부분 non number, non dash, or non dot에 있는 항목을 거부하십시오 . anything숫자로 시작하고 끝나는 경향을 준수해야 합니다.
  • 이제 우리의 캐치에는 부분이 , 및 anything로만 구성된 모든 파일이 있습니다 . 마지막 제약은 또는 가 각각을 왼쪽과 오른쪽 모두에 대한 바로 이웃으로 가져서는 안 된다는 것입니다.digit(s)dot(s)dash(s)dotdash
  • PS -name옵션은 파일 이름의 기본 이름 부분만 확인하고,
  • -name부분은 기반으로 작동하므로 wildcard암시적으로 고정됩니다. 즉, 일치하는 이름이 가득 찼음을 의미합니다.

관련 정보