내용에 패턴이 포함되지 않은 모든 파일을 제거합니다.

내용에 패턴이 포함되지 않은 모든 파일을 제거합니다.

지정된 텍스트가 포함되지 않은 모든 파일을 제거하려면 어떻게 해야 합니까?

지정된 텍스트가 포함된 파일을 제거하는 방법을 이해하지만 지정된 패턴이 포함되지 않은 파일을 제거해야 합니다.

다음 명령은 "성공적인 실행"이 포함되지 않은 파일 목록을 만듭니다.

grep -c "successful run" *.out | grep -v ":1" > err.txt

이 파일을 직접 삭제하고 싶습니다.

답변1

적절한 파일을 식별하는 독창적인 접근 방식

grep -c "successful run" *.out | grep -v ":1"

결함이 있습니다. 주요 관심사:

  • 한 파일에 두 개 이상의 일치하는 줄이 있으면 어떻게 되나요? grep ":0"질문 제목의 조건("패턴이 포함되지 않은 파일")에 더 잘 맞는 것 같습니다.
  • 파일 이름에 :1(또는 )이 있으면 어떻게 되나요 ? :0그래서 grep ':0$'더욱 좋은 것 같습니다.
  • 첫 번째 에서 전달된 파일 이름에 개행 문자가 있으면 어떻게 되나요 grep?

나는 의존하지 않는다고 말합니다 grep -c. 라인이 선택되지 않은 경우 grep의 종료 상태에 의존합니다 .1

for f in *.out; do
   [ -f "$f" ] && {
      grep -q -- "successful run" "$f"
      [ "$?" -eq 1 ] && rm -i -- "$f"
   }
done

노트:

  • [ -f "$f" ] && …grep일치하는 디렉토리, fifo 등을 사용할 수 없습니다 *.out. 일반 파일만.
  • 의 의미와 의미가 --설명되어 있습니다.여기. 이름이 로 시작하는 파일이 있을 경우 -옵션으로 오인될 수 있습니다. 이 문제를 해결하는 또 다른 방법은 입니다 for f in ./*.out; do …. 이렇게 하면 확장된 모든 항목이 $f로 시작하므로 ./로 시작할 수 없습니다 -.
  • rm -i만일을 대비해 사용했습니다 . 솔루션을 테스트한 후에는 을 생략할 수 있습니다 -i.
  • grep … || rm …더 나쁘다. 실제 오류가 발생하는 경우(예: 권한 거부)의 종료 상태 grep1; 그러면 파일을 제거하고 싶지 않을 것입니다. 내 솔루션은 종료 상태가 정확히 인지 테스트합니다 1.
  • 귀하의 원본 코드는 하위 디렉터리로 내려가지 않으며 내 코드도 마찬가지입니다. 재귀를 원할 경우 이를 지원하는 쉘(예: shopt -s globstar및 Bash 포함 **) 또는 기반 솔루션이 find유용할 것입니다.

답변2

파일에 단일 "성공적인 실행"이 있거나 없음을 고려하면 다음이 수행됩니다.

일치하는 파일을 찾으려면 다음을 수행하십시오.

grep -l "successful run" *.out > err.txt

찾아서 제거하려면 다음 단계를 따르세요.

grep -l "successful run" *.out | xargs rm

일치하지 않는 파일을 찾으려면 다음을 수행하십시오.

grep -vl "successful run" *.out > ok.txt

찾아서 제거하려면 다음 단계를 따르세요.

grep -vl "successful run" *.out | xargs rm

플래그의 의미는 다음과 같습니다.

-l lists the files with matches
-v/--invert-match inverts the matching logic

관련 정보