내가 기대하는 것은 다음과 같습니다. 디렉토리를 재귀적으로 검색하여 발견된 모든 파일에서 주어진 문자열을 찾습니다. 다음 명령은 일반적으로 사용되는 호출 포트입니다.
find ./ | xargs grep -ns 'foobar'
그러나 따옴표를 사용하면 셸에 foobar
프롬프트가 표시 되면서 명령이 실패합니다. >
문제를 일으킨 특정 명령은 다음과 같습니다.
find ./ | xargs grep -ns 'add_action(\'save_post\','
백슬래시를 사용하여 따옴표를 이스케이프 처리하려고 시도했지만 소용이 없었습니다. 이를 수행하는 올바른 방법은 무엇입니까?
답변1
작은따옴표는 작은따옴표로 끝나며, 그 사이에 있는 다른 모든 문자는 백슬래시를 포함하여 그대로 유지됩니다. 따라서 작은따옴표 사이에 작은따옴표를 포함할 수 없습니다. (하지만 당신은할 수 있는'Single quotes aren'\''t ever really embedded in single quotes.'
작은따옴표를 끝내고 작은따옴표를 이스케이프 처리한 후 ) 와 같이 새로운 작은따옴표 세트를 시작합니다.
제안:grep -r pattern .
현재 디렉토리에서 반복적으로 grep을 수행할 수 있는 경우 find+xargs를 사용하지 마십시오.
다음 명령은 동일한 동작을 갖습니다.
grep -rns "add_action('save_post'," .
grep -rns 'add_action('\'save_post\', .
마지막 명령은 다음과 같이 해석됩니다.
'add_action('
->add_action(
\'
->'
save_post
->save_post
\'
->'
,
->,
이러한 부품을 연결하기 위해 grep
명령은 매개변수를 받습니다 add_action('save_post',
.
답변2
xargs
매개변수가 이상한 방식으로 참조될 것으로 예상했지만 find
결과는 그렇지 않습니다. 파일 이름에 공백이 포함되어 있지 않다는 것을 모르는 경우에는 xargs
with를 함께 사용 하지 마십시오 .find
\"'
를 사용하지 않고 xargs
, find
실행하려는 프로그램을 직접 호출합니다.
find . -exec grep -ns 'add_action('\''save_post'\'',' {} +
를 사용하면 exec … {} +
을 사용하는 것처럼 여러 파일에 대해 동시에 한 번 호출됩니다 xargs
. 일부 이전 버전에서는 이를 find
지원하지 않으므로 각 파일에 대해 한 번 호출하여 +
사용해야 합니다 .;
grep
find … -print0 | xargs -0
유틸리티가 이를 지원하는 경우 해당 유틸리티도 사용할 수 있습니다. 이 -print0
옵션은 find
null 바이트로 구분된 이름을 내보내고 따옴표 해석 없이 null로 구분된 입력을 예상하도록 -0
지시합니다 .xargs
위의 인용문에 유의하세요. 작은따옴표 사이의 모든 문자는 '
리터럴 문자열의 끝을 나타내는 문자를 제외하고 문자 그대로 해석됩니다. 실제로 는 '\''
작은 따옴표로 묶인 문자열을 작은 따옴표로 묶은 문자열에 넣는 방법입니다. 공식적으로는 " '
끝 따옴표, \
리터럴 '
작은 따옴표, '
시작 따옴표"입니다.
의 특별한 경우 grep
, 구현에서 지원하는 경우 디렉토리에서 재귀 검색을 생략 find
하고 사용할 수 있습니다.grep -r
grep -r 'add_action('\''save_post'\'',' .
¹ 이러한 기능은 Linux, Cygwin, FreeBSD 및 OSX에서 지원됩니다.
답변3
grep "add_action('save_post'," ./* -R
-R
이 옵션을 사용하여 현재 디렉터리의 모든 파일에 대해 반복적으로 grep 할 수 있습니다 .검색 문자열은 으로 묶을 수 있습니다
"
.