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

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

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

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

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것입니다 . 즉 , 파이프 왼쪽에 있는 명령에서 아무것도 읽지 않는다는 의미입니다.rmgrep

대조적으로, 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, 전체 줄 일치만 찾습니다. 이는 줄의 시작과 끝 부분에 고정된 정규식을 사용하는 것과 동일한 효과를 갖습니다.

여기서는 -iwith를 사용하지 않았습니다 grep. 왜냐하면 다음과 같은 줄이 포함된 파일도 삭제되기 때문입니다 KEY = 0. kEY = 0그리고 귀하는 이러한 변경 사항에 대해 아무 말도 하지 않았습니다.

find예를 들어 명령을 특정 파일 이름 접미사로 제한하려면 를 실행하기 전에 명령에서 해당 접미사를 사용 하십시오 .ext. 예를 들어:-name '*.ext'findgrep

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

관련 정보