특정 파일 확장자를 제외하고 find 명령의 결과를 출력하는 방법

특정 파일 확장자를 제외하고 find 명령의 결과를 출력하는 방법

이것은 내 찾기 명령입니다.

find -mtime -$a | xargs zgrep -il ''$b'' | xargs zgrep -il ''$c'' | xargs zgrep -il ''$d'' | xargs zgrep -il 'ST.997' | sort -u

다음은 위 명령의 출력 예입니다.

example_file.dat.Z
example2_file.dat.Z
example2_file.dat.bak.1234567890.Z
example3_file.dat.Z
example3_file.dat.bak.Z
example4_file.dat.Z
example4_file.dat.bak.qwertyuiop.Z

보시다시피 ".bak" 확장자를 가진 동일한 파일을 출력합니다. 내가 원하는 것은 스크립트를 실행할 때마다 파일을 제외/표시하지 않는 것입니다. 이 예제의 출력과 같습니다.

example_file.dat.Z
example2_file.dat.Z
example3_file.dat.Z
example4_file.dat.Z

편집하다:잊어버렸어요. 때로는 zip 파일인 경우도 있습니다.

답변1

내 의견은 다음과 같습니다.

$ find . \( -name '*.bak*' -prune \) -o \
      -type f -mtime "-$a" \
      -exec zgrep -iq -e "$b" {} ';' \
      -exec zgrep -iq -e "$c" {} ';' \
      -exec zgrep -iq -e "$d" {} ';' \
      -exec zgrep -iq 'ST.997' {} ';' \
      -print | sort

또는

$ find . ! -name '*.bak*' \
      -type f -mtime "-$a" \
      -exec zgrep -iq -e "$b" {} ';' \
      -exec zgrep -iq -e "$c" {} ';' \
      -exec zgrep -iq -e "$d" {} ';' \
      -exec zgrep -iq 'ST.997' {} ';' \
      -print | sort

각각의 주어진 "술어"는 발견된 내용에 대한 "테스트" find역할을 합니다 . find하나의 테스트가 실패하면 다음 조건자는 평가되지 않고(달리 지정하지 않는 한 각 조건자 사이에 암시적 "논리적 AND"가 있음) 다음으로 발견된 이름이 고려됩니다.

  1. \( -name "*.bak" -prune \)비트는 "이름이 주어진 패턴과 일치하면 검색 결과에서 제거합니다"를 의미합니다. 이것월러 라인로 대체될 수 있습니다 ! -name '*.bak*'.
  2. -o"논리적 OR"을 의미합니다.
  3. -type f일반 파일에만 적용됩니다.
  4. -mtime "-$a"이는 수정 타임스탬프가 $a24시간 미만인 파일에 적용됩니다.
  5. -exec zgrep -q ... {} ';'지정된 패턴이 파일에서 일치하거나 오히려 zgrep0 종료 상태로 종료되는 경우( 일치하는 항목이 발견되었지만 출력이 생성되지 않는 경우) zgrep -q각각은 true입니다 . 플래그는 주어진 변수의 값이 패턴으로 작동하도록 강제합니다(변수 중 하나가 로 시작하는 경우 중요합니다 -e) .zgrep-
  6. -print이름이 출력됩니다(조건자는 항상 "true"입니다).

바꾸고 싶지 않다면모두grep -v '\.bak'명령의 경우 해킹된 수정 방법은 단순히 원래 명령의 결과를 또는 를 통해 전달하는 것이지만 grep -vF '.bak', 현재 명령의 경우 이국적인 파일 이름(예: 개행 문자가 포함된 이름)이 있는 파일에는 문제가 발생합니다.

답변2

마침내 답을 찾았습니다. 오랜 실험 끝에. ㅋ

여기있어:

find -mtime -$a -type f ! -name "*.bak*" | xargs zgrep -il "$b" | xargs zgrep -il "$c" | xargs zgrep -il "$d" | xargs zgrep -il 'ST.997' | sort -u

관련 정보