디렉터리 구조를 유지하면서 문자열이 포함된 파일과 줄만 복사합니다.

디렉터리 구조를 유지하면서 문자열이 포함된 파일과 줄만 복사합니다.

다른 디렉터리와 파일을 포함하는 디렉터리가 있다고 가정해 보겠습니다. 각 파일에서 문자열을 검색하고 디렉터리 구조를 유지하면서 일치하는 줄만 다른 위치에 복사하고 싶습니다.

예를 들어 다음과 같은 구조가 있다고 가정해 보겠습니다.

dir
  subdir1
     file1.txt
  subdir2
     file2.txt

그리고

file1.txt:

abc

def

그리고

file2.txt:

ghi

이제 'de'가 포함된 파일에서 일치하는 줄만 가져오고 싶으므로 원하는 결과는 다음과 같아야 합니다.

dir
  subdir1
     file1.txt
  subdir2

그리고

file1.txt

def

답변1

GNU find(1), xargs(1)grep(1):

  • 디렉토리 구조를 복제하십시오.

    src=/path/to/source
    dest=/other/path/to/destination
    pat='some_grep_pattern'
    
    cd "$dest"
    find "$src" -type d ! -path "$src" -printf '%P\0' | xargs -0 mkdir -p
    
  • 주어진 패턴으로 파일을 복사합니다:

    cd "$src"
    grep -rlZ "$pat" | \
        (cd "$dest"; \
        xargs -0 sh -c ' \
            while [ $# -ne 0 ]; do \
                grep "$pat" "$src/$1" >"$1"; \
                touch -r "$src/$1" >"$1"; \
                shift; \
            done' sh)
    
  • Linux를 가정하고 개행 문자가 포함된 파일 이름이 없다고 가정하고 복원 권한을 설정합니다.

    cd "$src"
    getfacl -RPe . | (cd "$dest"; setfacl --restore=-)
    

관련 정보