파일이 꽤 많지만 ' 파일 check_dns
에 정의된 위치를 찾으려고 합니다 .nagios
commands.cfg
일치하는 항목을 검색하는 것과 같은 작업을 실행할 수 있다는 것을 알고 있지만 가능하다면 색인된 복사본이고 훨씬 빠르기 때문에 find / -name "command.cfg" -exec grep check_dns {} \;
사용하고 싶습니다 .locate
실행하면 locate commands.cfg
다음과 같은 결과를 얻습니다.
/etc/nagios3/commands.cfg
/etc/nagiosgrapher/nagios3/commands.cfg
/usr/share/doc/nagios3-common/examples/commands.cfg
/usr/share/doc/nagios3-common/examples/template-object/commands.cfg
/usr/share/nagiosgrapher/debian/cfg/nagios3/commands.cfg
/var/lib/ucf/cache/:etc:nagiosgrapher:nagios3:commands.cfg
각 결과를 xargs
얻을 수 있도록 찾기를 실행하고 이를 인라인 명령이나 다른 것으로 파이프할 수 있습니까 ? grep
for 루프를 사용하여 이 작업을 수행할 수 있다는 것을 알고 있지만 여기서는 이 특정 경우에 대해 수행하는 방법보다 더 많은 bash-fu / shell-fu를 선택하려고 합니다.
답변1
xargs
예, 이에 사용할 수 있습니다 .
예를 들면 다음과 같습니다.
$ locate commands.cfg | xargs grep check_dns
( grep
여러 파일을 볼 때 각각에서 검색하고 일치하는 파일 이름 인쇄를 활성화합니다.)
또는 다음을 통해 명시적으로 파일 이름 인쇄를 활성화할 수 있습니다.
$ locate commands.cfg | xargs grep -H check_dns
(단 하나의 grep
인수가 1개만 호출되는 경우를 대비해 xargs
)
( 와 달리) 하나의 파일 이름 인수만 허용하는 프로그램의 경우 grep
다음과 같이 제공되는 인수 수를 제한할 수 있습니다.
$ locate commands.cfg | xargs -n1 grep check_dns
일치하는 줄이 있는 파일의 이름은 인쇄되지 않습니다.
결과는 다음과 같습니다.
$ locate commands.cfg | xargs grep -h check_dns
최신 Locate/xargs를 사용하면 공백 문제로부터도 보호할 수 있습니다.
$ locate -0 commands.cfg | xargs -0 grep -H check_dns
(기본적으로 공백은 입력을 구분합니다 xargs
. 이는 물론 파일 이름에 공백이 포함된 경우 문제가 됩니다...)