두 개의 쉘 명령을 논리적으로 결합하는 방법이 있습니까?찾기-실행?
예를 들어 모두 인쇄해 보세요..csv문자열 foo와 해당 발생 횟수가 포함된 파일을 사용하여 다음을 수행하고 싶습니다.
find . -iname \*.csv -exec grep foo {} && echo {} \;
하지만세게 때리다"'-exec' 인수 누락"에 대해 불평합니다.
답변1
-exec
셸이 아닌 명령을 실행하고 결과를 계산하는 조건자입니다.진짜또는잘못된명령 결과(0 또는 0이 아닌 종료 상태)를 기준으로 합니다.
그래서:
find . -iname '*.csv' -exec grep foo {} \; -print
회의인쇄grep
파일에 foo가 있는 경우 파일 경로입니다. 대신 다른 술어나 다른 술어를 -print
사용할 수 있습니다 .-exec
find . -iname '*.csv' -exec grep foo {} \; -exec echo {} \;
음수 합계에 대한 연산자 도 참조 !
하고 찾아보세요.-o
또는.
또는 다음과 같이 셸을 시작할 수 있습니다.
find . -iname '*.csv' -exec sh -c '
grep foo "$1" && echo "$1"' sh {} \;
또는 각 파일에 대해 쉘을 시작하지 마십시오.
find . -iname '*.csv' -exec sh -c '
for file do
grep foo "$file" && echo "$file"
done' sh {} +
답변2
직면한 문제는 쉘이 먼저 명령줄을 구문 분석하고 &&
연산자로 구분된 두 개의 간단한 명령( find . -iname \*.csv -exec grep foo {}
, 및 ) 을 본다는 것입니다 echo {} \;
. ( )를 인용하면 &&
이를 무시 find . -iname \*.csv -exec grep foo {} '&&' echo {} \;
하지만 이제 , 및 인수를 사용하여 유사한 find
명령 을 실행합니다 . 이 연산자를 해석하는 쉘을 실행하도록 지시해야 합니다 .grep
foo
wibble.csv
&&
echo
wibble.csv
find
&&
find . -iname \*.csv -exec sh -c 'grep foo "$0" && echo "$0"' {} \;
sh -c SOMECOMMAND
is 뒤의 첫 번째 매개변수 $0
는 가 아닙니다 $1
.
처리를 용이하게 하려면 파일 이름을 열거 할 수 -exec … +
있도록 일부 더미 값을 전달하세요 .$0
"$@"
find . -iname \*.csv -exec sh -c 'for x in "$@"; do grep foo "$x" && echo "$x"; done' \ {} +
쉘 명령이 두 개의 프로그램으로 분리된 두 개의 프로그램인 경우 &&
이를 find
직접 수행할 수 있습니다. 두 개의 연속 -exec
작업을 작성하고 첫 번째 작업이 상태 0으로 종료되는 경우에만 두 번째 작업을 실행합니다.
find . -iname \*.csv -exec grep foo {} \; -exec echo {} \;
(나는 단지 설명을 위한 목적으로 grep
and 를 사용하고 and 로 대체할 수 있다고 가정합니다 . 결과 출력은 어쨌든 특별히 유용하지 않습니다.)echo
-exec echo
-print
답변3
이 특별한 경우에는 다음과 같이 합니다.
find . -iname \*.csv -exec grep -l foo \{\} \;
아니면 당신이 가지고 있다면확인하다:
ack -al -G '.*\.csv' foo
실제 질문에 답하려면 다음과 같이 하면 됩니다.
find . -iname \*.csv -exec sh -c "grep foo {} && echo {}" \;