내 재귀 grep이 작동하지 않는 이유는 무엇입니까?

내 재귀 grep이 작동하지 않는 이유는 무엇입니까?

저는 상위 디렉터리에 있고 "GWT"라는 문구가 포함된 ODT 파일(LibreOffice Writer)을 검색하고 싶습니다.

저는 Ubuntu 12.04 데스크탑을 사용하고 있습니다. 터미널에서:

myUser@myMachine:~/sandbox$ pwd
/home/myUser/sandbox
myUser@myMachine:~/sandbox$ ls
cloudflip  doctrang  eclipse   lookslike  scripts       squirrel  warlib

이러한 모든 파일 시스템 개체( eclipse, scripts등)는 폴더입니다.

myUser@myMachine:~/sandbox$ grep -i -r "GWT" *.odt
grep: *.odt: No such file or directory

나 여기 어디로 가는 거지? 미리 감사드립니다!

답변1

ODT 파일은 실제로 Zip 파일입니다(참조:https://stackoverflow.com/questions/4957212/how-does-open-office-compress-its-fileszipgrep) 다음과 같은 명령을 사용하여 grep할 수 있어야 합니다 .

find ~/sandbox -name "*.odt" -type f -print0 | xargs -0 zipgrep GWT

답변2

Bash 4를 사용한다고 가정하면 다음을 수행할 수 있습니다.

shopt -s globstar
grep -i GWT **/*.odt
shopt -u globstar

쉘 옵션의 경우글로스타설정되어 있으며,**현재 디렉터리의 모든 하위 디렉터리와 재귀적으로 일치합니다. 두번째상점명령은 명령을 설정 해제합니다. 이 단계는 선택 사항입니다.

@vanthome이 지적했듯이 ODT 파일을 수집하면 실제로 압축되기 때문에 아무 소용이 없습니다. 두 가지 불편한 점이 있습니다.

  1. 그만큼zipgrep명령은 둘 이상의 아카이브 이름을 인수로 사용하지 않으므로 모든 ODT 파일을 반복해야 합니다.
  2. zipgrep일치하는 줄만 인쇄합니다(매우ODT 파일의 길이), 따라서 어떤 파일에 문자열이 포함되어 있는지 알 수 없습니다.

다음은 원하는 결과를 얻을 수 있습니다.

shopt -s globstar

for file in **/*.odt; do
    unzip -c "$file" | grep -iq GWT && echo "$file"
done

shopt -u globstar

그만큼~을 위한루프는 모든 하위 디렉터리의 모든 ODT 파일을 통과합니다. 발견된 각 파일에 대해 해당 내용을 STDOUT으로 압축 해제합니다. 그 다음에,grep아무것도 출력하지 않고 원하는 문자열을 검색합니다( -q). 일치하는 항목이 발견되면,grep0을 반환하고 논리 AND( &&) 이후의 명령이 실행되므로 파일 이름이 터미널에 에코됩니다.

관련 정보