검색에서 파일 필터링

검색에서 파일 필터링

ls날짜와 타임스탬프가 포함된 파일이 있는데 다음과 같이 출력에서 ​​제외하고 싶습니다 .

 test.log.15-05-25_20:41:05.20150611
 test.log.15-05-27_20:28:32.20150611
 test.log.15-05-26_20:29:40.20150611
 test.log.
 test-file~df_gp~1.log.
 test.log.20150616
 test.log.15-05-28_20:28:27.20150616
 test.log.15-05-27_20:28:32.20150616
 test.log.15-05-26_20:29:40.20150616
 test.log.15-05-25_20:41:05.20150616
 test-bat-test.log.

출력에는 다음 파일만 나열되어야 합니다. 즉, 날짜와 타임스탬프가 포함된 파일은 생략해야 합니다.

 test.log.
 test-file~df_gp~1.log.
 test-bat-test.log.

내가 할 수 있는 방법이 있나요?

답변1

GNU를 사용할 수 있습니다 find.

 find * -regextype posix-extended \! -regex '.*[0-9]{8}.*' -prune

날짜가 항상 문자열 끝에 있고 앞에 오는 경우 .정규식을 사용하여 .*\.[0-9]{8}이를 반영하고 파일을 잘못 제외하는 위험을 줄일 수도 있습니다.

작동 방식:

  • -regextype posix-extended아래 정규식에 적합한 정규식 유형을 선택하세요.
  • \!다음 문장의 의미를 부정하세요
  • -regex '.*[0-9]{8}.*'연속된 8자리 숫자(예: 형식의 날짜 20150616) 가 포함된 모든 파일과 일치합니다.
  • -prunefind하위 디렉터리가 나열되지 않도록 방지

다른 옵션:

  • -f파일만 나열하는 옵션 추가

편집하다:

정규식을 지원하지 않는 AIX에서는 find다음을 사용할 수 있습니다(표준 전역 메커니즘 사용).

find * \! -name '*[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]*' -prune

또는 날짜가 항상 문자열 끝에 있고 앞에 가 오는 경우 .다음 패턴을 사용할 수 있습니다.*.[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]

편집 2:

파일을 로 시작하려면 다음을 test사용할 수 있습니다.

find * -prune -type f \! -name 'test*.[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]'

쉘을 통한 파일 이름 확장을 사용하고 싶지 않고 해당 디렉토리에 다른 디렉토리가 없는 경우 다음을 사용할 수도 있습니다.

find . -type f \! -name 'test*.[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]'

답변2

나는 보통 이것을 | grep -v원하지 않는 행을 필터링하는 데 사용합니다. grep이 충분히 제거되지 않으면 다른 것을 추가하겠습니다.

$ ls | grep -v 2015 |grep -v 2014

이는 find에 대한 정규식 posix 인수를 기억하는 것보다 쉽습니다 :)

관련 정보