![특정 내용이 포함된 파일 삭제](https://rvso.com/image/178487/%ED%8A%B9%EC%A0%95%20%EB%82%B4%EC%9A%A9%EC%9D%B4%20%ED%8F%AC%ED%95%A8%EB%90%9C%20%ED%8C%8C%EC%9D%BC%20%EC%82%AD%EC%A0%9C.png)
한 디렉토리에 수천 개의 데이터 파일(동일한 확장자)이 있는데 특정 매개변수 명령문이 포함된 파일을 삭제하는 방법은 무엇입니까?
예를 들어, 다음 줄이 포함된 모든 파일을 삭제하려고 했다면
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
명령에 두 가지 주요 문제가 있습니다.
- 파일 이름과 일치하는 줄을 출력합니다.
rm
우리가 알아야 할 것처럼 이것은 아무 소용이 없습니다오직삭제하려는 파일의 파일 이름. 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
사용 하지 않습니다 . 이러한 경우 변형에 대해서는 아무 말도 하지 않았습니다.grep
KEY = 0
kEY = 0
find
명령을 와 같은 특정 파일 이름 접미사로 제한하고 를 실행하기 전에 명령 에 .ext
사용 하시겠습니까 ? 예를 들어:-name '*.ext'
find
grep
find . -name '*.ext' -type f -exec grep -q -F -x 'Key = 0' {} \; -exec rm -f {} +