Linux find 및 grep 명령을 사용하는 데 문제가 있습니다. 기본적으로 CD를 디렉터리에 넣고 특정 날짜 이후에 수정된 모든 example.txt 파일을 반복적으로 찾은 다음 해당 파일을 grep해야 합니다. 아래 명령은 어느 정도 작동하지만 동일한 파일에 대해 여러 결과를 제공하므로 얼마나 안정적인지 잘 모르겠습니다.
find ./ -name "example.xml" -newermt "2018-01-01" -exec grep -r "videoplayer.1" /. \;
답변1
내 생각에 올바른 명령 형식은 다음과 같습니다.
find ./ -name "example.xml" -newermt "2018-01-01" -exec grep -r "videoplayer.1" {} \;
명령 {}
의 일부가 누락되었습니다 find
. 검색 결과는 grep으로 전달되지 않습니다.
답변2
find ./ -name "example.xml" -newermt "2018-01-01" -exec grep -r "videoplayer.1" /. \;
그러면 find
현재 디렉터리부터 시작하여 ./
-name이 업데이트된(수정 시) example.xml
모든 파일에 대해 명령이 실행됩니다 .2018-01-01
grep -r "videoplayer.1" /.
그러나 우리는 grep
명령이 수행된다는 것을 알 수 있습니다아니요발견된 파일 이름이 고려되지만 find
명령은 항상 동일합니다. 게다가 -r
시작은파일 시스템 루트( /.
). 자, 이것은 철자 오류( ./
vs. /.
)일 수 있지만 의미는 완전히 달라집니다.
를 사용하더라도 grep -r ... ./
검색은 현재 디렉터리에서 반복적으로 시작되는 반면, 을 사용하면 현재 디렉터리에서 -exec
검색이 시작됩니다.find
를 사용하는 경우 자리 표시자를 find -exec
사용하여 현재 처리 중인 파일 이름을 삽입할 위치를 {}
알려야 합니다. find
그래서
find ./ -name "example.xml" -newermt "2018-01-01" -exec grep "videoplayer.1" {} \;
2018년 1월 1일 이후 이름이 지정된 모든 파일에서 실행됩니다.grep videoplayer.1 filename
example.xml
실제로 \;
종료 -exec
명령을 로 대체하여 단일 호출에 여러 파일을 전달할 +
수 있습니다 . 이렇게 하면 시작해야 하는 프로세스 수가 줄어들기 때문에 전체 작업이 더 빨라집니다.find
grep
find ./ -name "example.xml" -newermt "2018-01-01" -exec grep "videoplayer.1" {} \+
grep
또는 처리 중인 파일 이름이 나열되는지 확인하려면 이 -H
플래그를 사용할 수 있습니다(적어도 GNU 및 BSD에서는 grep
).
-H, --with-filename
일치하는 각 파일 이름을 인쇄합니다. 검색할 파일이 여러 개인 경우 기본 설정입니다.
(또 다른 방법은 주어진 파일 목록에 -H
이와 같은 것을 추가하는 것 입니다 )/dev/null
grep