그래서 저는 명령줄을 처음 접했습니다. 파일에 특정 위치가 없기 때문에 find를 사용하여 여러 디렉터리에서 여러 파일의 출력을 가져올 수 있었습니다(단축할 수 있다고 확신합니다).
find ./ -name filename1.ext && find ./ -name filename2.ext && find ./ -name filename3.ext
이제 이것은 내가 원하는 목록을 제공하지만 이제 문제의 파일을 찾았으므로 해당 파일을 찾아 정보를 얻으려고 합니다.
답변1
name
모든 항목을 find 문으로 그룹화하고 find가 grep을 수행하도록 할 수 있습니다 .
find . \( -name filename1.ext -o \
-name filename2.ext -o \
-name filename3.ext \) \
-exec grep 'pattern' {} \;
답변2
이 시도,
find ./ -type f \( -name filename1.ext -o -name filename2.ext -o -name filename3.ext \) -exec grep 'string' {} \;
-type f
파일을 찾고 있으므로 더 빠른 결과를 얻으려면 유형을 지정하는 것이 좋습니다.-o
검색에 더 많은 파일 이름을 추가할 수 있는 "또는"을 나타냅니다.
답변3
정답은 실제로 -o
and 를 사용하는 것입니다 -exec
. 이전 명령의 출력을 캡처하여 한 줄씩 구문 분석하는 일반적인 방법은 다음 과 같습니다.
(find .... && find ... && cat ... && ls ... && ...) | while read line; do grep string $line; done
답변4
find
일반적으로 말해서 + 결합 에는 최소한 세 가지 방법이 있습니다 grep
.
grep
무늬`find
목차 지정자 찾기-print`
find
목차 지정자 찾기-exec grep
무늬{} \;
find
목차 지정자 찾기-print | xargs grep
무늬
물론 grep
여기에는 특별한 것이 없습니다. 이 동일한 세 가지 패턴을 find
모든 명령에 사용할 수 있습니다.
어떤 의미에서 방법 1은 가장 오래되고 가장 기본적인 방법입니다. 백틱은 항상 한 명령의 출력을 캡처하여 다른 명령의 명령줄에서 사용하는 방법이었기 때문입니다. (요즘 백틱보다 좋은 배시즘이 새로나서 멋있는 애들은 다 쓰는 것 같은 느낌을 받지만 저는 구식인가 봅니다.) 1번의 단점은 많이 find
찾으면 파일 수가 많으면 "명령줄이 너무 깁니다"라는 오류가 발생할 수 있습니다.
2번은 + 명령 조합을 find
실행하기 위해 내장된 특수 기능입니다 . find
일단은 괜찮지만 두 가지 단점이 있습니다. (1) grep
발견된 모든 파일에 대해 보조 명령(또는 다른 명령)을 다시 호출하므로 속도가 느려질 수 있고, (2) 보조 명령이 다음과 같은 경우 grep
, 각 호출마다 grep
파일 이름이 표시되므로 일치하는 파일 이름이 나열되지 않습니다. 하지만 다음을 수행하여 이 문제를 해결할 수 있습니다.-exec grep
무늬 {} /dev/null \;
아니면 요즘은-exec grep -H
무늬 {} \;
.
그다음 세 번째. 내가 아는 한, xargs
처음 두 가지의 한계를 극복하기 위해 발명되었습니다. xargs
이론적으로는 범용 프로그램이지만 실제로는 및 이외의 프로그램 쌍과 함께 find
사용되는 경우가 거의 없다고 생각됩니다 grep
. 이는 첫 번째 단점을 완전히 해결합니다. 발견된 파일 수에 관계없이 작동합니다. 훌륭하게 작동하지만 운이 좋지 않으면 가끔 마지막 파일 이름을 호출하게 되므로 여전히 or 트릭을 grep
사용하고 싶다는 뜻입니다 . 자체적인 단점이 있습니다. 발견된 파일 이름에 공백이 포함되어 있으면 작동하지 않습니다. 그러나 해결 방법도 있습니다./dev/null
-H
find
목차 지정자 찾기 -print0 | xargs -0 grep
무늬
xargs
( 기본적으로 공백 대신 개행으로 구분된 파일 이름을 허용하도록 작성하고 싶지만 이는 또 다른 날의 호언장담이 될 것입니다.)