
저는 상위 디렉터리에 있고 "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 파일을 수집하면 실제로 압축되기 때문에 아무 소용이 없습니다. 두 가지 불편한 점이 있습니다.
- 그만큼zipgrep명령은 둘 이상의 아카이브 이름을 인수로 사용하지 않으므로 모든 ODT 파일을 반복해야 합니다.
- 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( &&
) 이후의 명령이 실행되므로 파일 이름이 터미널에 에코됩니다.