특정 내용이 포함된 파일 삭제

특정 내용이 포함된 파일 삭제

한 디렉토리에 수천 개의 데이터 파일(동일한 확장자)이 있는데 특정 매개변수 명령문이 포함된 파일을 삭제하는 방법은 무엇입니까?

예를 들어, 다음 줄이 포함된 모든 파일을 삭제하려고 했다면

Key = 0

내가 뭔가를 할 수 있을까?

grep -i "Key = 0" * | rm *

답변1

쉘에서 다음 명령을 사용할 수 있습니다. 검색할 패턴이 다음과 같은 경우 작업을 수행해야 합니다.Key = 0

grep -lrIZ "Key = 0" . | xargs -0 rm -f --

일반 명령:

grep -lrIZ "<Pattern to be searched in the file>" . | xargs -0 rm -f --

답변2

grep+를 사용하는 파이프라인의 주요 문제는 표준 입력 스트림에서 읽지 않는다는 rm것입니다 . 즉 , 파이프 왼쪽에 있는 명령 rm에서 아무것도 읽지 않는다는 의미입니다 .grep

대신 rm *파이프 오른쪽에 있는 는 모든 입력을 무시하고 rm현재 디렉터리에 표시되는 모든 파일 이름에 대해 실행됩니다.

rm표준 입력을 읽지 못하는 문제를 무시하면 grep명령에 두 가지 주요 문제가 있습니다.

  1. 파일 이름과 일치하는 줄을 출력합니다. rm우리가 알아야 할 것처럼 이것은 아무 소용이 없습니다오직삭제하려는 파일의 파일 이름.
  2. Key = 0다음과 같이 일치합니다.하위 문자열, 이는 또한 일치함 Crypto Key = 0x01을 의미합니다.

find . -type f -exec grep -q -F -x 'Key = 0' {} \; -exec rm -f {} +

또는 GNU find(및 기타 일부) 의 경우

find . -type f -exec grep -q -F -x 'Key = 0' {} \; -delete

두 가지 모두 현재 디렉터리나 그 아래 디렉터리에서 일반 파일을 찾고, 발견된 각 파일에 대해 grep -q -F -x 'Key = 0'. 이 grep명령은 파일에 다음 행이 있는지 여부를 알리는 종료 상태를 반환합니다.정확히 Key = 0(그리고 다른 것은 없습니다).

두 번째 명령은 해당 행이 발견되면 find해당 술어를 사용하여 파일을 삭제합니다 . -delete첫 번째 find명령은 이 줄을 포함하는 파일의 경로 이름을 수집한 다음 rm -f일괄적으로 실행합니다.

와 함께 사용되는 플래그는 grep다음과 같습니다.

  • -q, 조용한 작동을 위해. 유틸리티는 일치하는 행을 출력하지 않지만 첫 번째 일치 후에 성공적으로 종료되거나 파일에 일치 항목이 없으면 0이 아닌 종료 상태로 종료됩니다.
  • -F, 고정 문자열 일치의 경우. 정규식이 아닌 문자열로 일치시킵니다.
  • -x, 전체 줄 일치만 찾으려면. 이는 줄의 시작과 끝 모두에 고정된 정규식을 사용하는 것과 동일한 효과를 갖습니다.

여기서는 등과 같은 줄이 포함된 파일도 삭제되므로 여기서는 -i사용 하지 않습니다 . 이러한 경우 변형에 대해서는 아무 말도 하지 않았습니다.grepKEY = 0kEY = 0

find명령을 와 같은 특정 파일 이름 접미사로 제한하고 를 실행하기 전에 명령 에 .ext사용 하시겠습니까 ? 예를 들어:-name '*.ext'findgrep

find . -name '*.ext' -type f -exec grep -q -F -x 'Key = 0' {} \; -exec rm -f {} +

관련 정보