仅复制文件和仅包含字符串的行,同时保留目录结构

仅复制文件和仅包含字符串的行,同时保留目录结构

假设我有一个包含其他目录和文件的目录。我想在每个文件中搜索一个字符串,并仅将匹配的行复制到另一个位置,同时保留目录结构。

例如,假设我有这个结构

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=-)
    

相关内容