newermt 파일 찾기 및 grep 파일 내용이 작동하지 않음

newermt 파일 찾기 및 grep 파일 내용이 작동하지 않음

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-01grep -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 filenameexample.xml

실제로 \;종료 -exec명령을 로 대체하여 단일 호출에 여러 파일을 전달할 +수 있습니다 . 이렇게 하면 시작해야 하는 프로세스 수가 줄어들기 때문에 전체 작업이 더 빨라집니다.findgrep

find ./ -name "example.xml" -newermt "2018-01-01" -exec grep  "videoplayer.1" {} \+

grep또는 처리 중인 파일 이름이 나열되는지 확인하려면 이 -H플래그를 사용할 수 있습니다(적어도 GNU 및 BSD에서는 grep).

  -H, --with-filename       

일치하는 각 파일 이름을 인쇄합니다. 검색할 파일이 여러 개인 경우 기본 설정입니다.

(또 다른 방법은 주어진 파일 목록에 -H이와 같은 것을 추가하는 것 입니다 )/dev/nullgrep

관련 정보