find를 사용하여 파일을 가져온 다음 grep을 사용하십시오.

find를 사용하여 파일을 가져온 다음 grep을 사용하십시오.

그래서 저는 명령줄을 처음 접했습니다. 파일에 특정 위치가 없기 때문에 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

정답은 실제로 -oand 를 사용하는 것입니다 -exec. 이전 명령의 출력을 캡처하여 한 줄씩 구문 분석하는 일반적인 방법은 다음 과 같습니다.

(find .... && find ... && cat ... && ls ... && ...) | while read line; do grep string $line; done

답변4

find일반적으로 말해서 + 결합 에는 최소한 세 가지 방법이 있습니다 grep.

  1. grep 무늬 `find 목차 지정자 찾기 -print`
  2. find 목차 지정자 찾기 -exec grep 무늬 {} \;
  3. 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( 기본적으로 공백 대신 개행으로 구분된 파일 이름을 허용하도록 작성하고 싶지만 이는 또 다른 날의 호언장담이 될 것입니다.)

관련 정보