하위 디렉터리에서 "파일의 문자열"을 grep한 다음 전체 "폴더"를 복사합니다.

하위 디렉터리에서 "파일의 문자열"을 grep한 다음 전체 "폴더"를 복사합니다.

노력하고있어:

  1. 내 모든 하위 디렉터리(약 50개 폴더)에 있는 모든 파일(파일 이름: OUTCAR.txt)에서 "정확도 요구" 문자열을 찾고 있습니다.

  2. 검색 문자열이 포함된 파일이 포함된 폴더만 다른 위치로 복사

현재 내 솔루션은 다음과 같습니다.

1. grep -r "required accuracy" 

하지만 OUTCAR이라는 파일에서만 검색하고 싶습니다. 그렇지 않으면 내 목록의 폴더에 두 개의 파일이 있습니다.

2. grep -r "required accuracy" OUTCAR -exec scp -r {} ./final location

grep 명령을 사용하여 찾은 파일 목록에서 폴더 목록을 추출하는 방법을 전혀 모릅니다. 어쩌면 find 명령을 사용하여 파일에서 문자열을 찾을 수 있을까요?

답변1

find사용 가능한 경우 -execdir:

find . -type f -name "OUTCAR.txt" \
-exec grep -q "required accuracy" {} \;
-execdir scp -r ./ "/path/to/final location" \;
  • -type f( )가 있는 모든 파일을 찾습니다 -name OUTCAR.txt.
  • grep이 문서의 "필요한 정확성"에 대해서는
  • grep성공 하면 scp파일이 있는 디렉터리에서...를 실행합니다 -execdir.

이는 절대 경로여야 합니다 . /path/to/final/location그렇지 않으면 .$PWD/relative/path/from/where/find/is/executed

답변2

이 시도,

 grep -lr 'required accuracy' rel1 | sed 's#/OUTCAR.txt##g' | xargs -I {} mv {} rel1_fin
  • -l일반 출력을 억제합니다. 대신 print는 일반적으로 각 입력 파일의 이름을 인쇄합니다. 첫 번째 일치에서 스캔이 중지됩니다.

답변3

나는 이것이 도움이 될 것이라고 생각합니다:

grep -Rl "required accuracy"  ./Source-dir/* | grep OUTCAR | xargs -I[] bash -c 'val="[]";scp -r ${val%/*} user@doman:/destination-direcory'

관련 정보