디렉토리에는 수천 개의 데이터 파일(동일한 확장명 포함)이 있습니다. 특정 매개변수 명령문이 포함된 데이터 파일을 삭제하는 방법은 무엇입니까?
예를 들어 다음 줄이 포함된 모든 파일을 삭제하려면
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
with를 사용하지 않았습니다 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 {} +