다른 디렉터리와 파일을 포함하는 디렉터리가 있다고 가정해 보겠습니다. 각 파일에서 문자열을 검색하고 디렉터리 구조를 유지하면서 일치하는 줄만 다른 위치에 복사하고 싶습니다.
예를 들어 이런 구조가 있다고 해보자.
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=-)