grep 결과를 전송하여 찾기

grep 결과를 전송하여 찾기

다른 이벤트 사이의 일부 파일 이름이 포함된 로그 파일이 있는데 하위 폴더에서 찾아야 합니다. 특정 폴더 및 하위 폴더에 있어야 하는 xml 파일 내의 파일 이름에도 동일한 필요성이 적용됩니다. 로그 파일에 grep을 사용하고 정확한 파일 이름을 추출한 다음 조회에 제공해야 할 것 같습니다. 한 줄에 파일 이름 목록을 쉽게 얻을 수 있지만 find로 작업하도록 하는 것은 정확히 작동하지 않습니다. 인터넷은 그 반대의 답변으로 가득 차 있습니다. grep을 입력한 결과를 찾으세요.

grep -oP '(?<=Some problem with file named ).*pdf(?=\.)' /home/myname/log/myspecificlogfile.log

이 명령의 결과를 xargs에 파이핑하여 살펴보았지만 실제로 존재하지 않는 파일과 실제로 존재하는 파일 모두에서 결과가 나오지 않았습니다. echo 단순화하기 위해 find 매개변수 -ls가 아직 추가되지 않았습니다(하지만 필요합니다).

echo 12345.pdf | xargs -0 -I{} find /home/myname/workfolders/ -name '{}'    #Nonexisting pdf
echo 67890.pdf | xargs -0 -I{} find /home/myname/workfolders/ -name '{}'   #Existing pdf, no results

폴더 및 하위 폴더에 있는 파일을 찾기 위해 grep 결과를 어떻게 파이프할 수 있습니까?

답변1

나는 그것을 할 것이다:

grep -oP '(?<=Some problem with file named ).*pdf(?=\.)' \
  /home/myname/log/myspecificlogfile.log | awk -F / '
     ARGIND == 1 {files[$0]; next}
     $NF in files' - RS='\0' <(
     find /home/myname/workfolders/ -name '*pdf' -type f -print0)

grep( 및 의 GNU 구현과 , 또는 같은 awk프로세스 대체를 지원하는 쉘을 가정 ).kshzshbash

find예를 들어, 파일 이름이나 ' 를 사용하는 것은 적합하지 않습니다 -name. 파일 이름당 한 번씩 실행하는 것은 비효율적입니다. 의 호출을 사용하는 솔루션을 생성하더라도 수행 중인 해시 조회보다 여전히 효율성이 떨어질 수 있습니다.*.pdf?.pdffindfind-name a.pdf -o -name b.pdf...awk

답변2

사용된 다른 변형찾기+그렙

find /home/myname/workfolders/ \
     -name '*pdf' -type f -exec grep -qFf \
          <(grep -oP '(?<=Some problem with file named ).*pdf?(?=\.)'\
                 /home/myname/log/myspecificlogfile.log) \
     -print

또는 두 개의 명령으로 파이프할 수 있습니다.

find /home/myname/workfolders/ -name '*pdf' -type f |
grep -qFf <(grep -oP '(?<=Some problem with file named ).*pdf?(?=\.)' \
            /home/myname/log/myspecificlogfile.log)

관련 정보