ディレクトリ構造を維持しながら、ファイルのみと文字列を含む行のみをコピーします。

ディレクトリ構造を維持しながら、ファイルのみと文字列を含む行のみをコピーします。

他のディレクトリとファイルを含むディレクトリがあるとします。各ファイルで文字列を検索し、ディレクトリ構造を維持しながら一致する行のみを別の場所にコピーしたいと考えています。

例えば、この構造があるとします

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

関連情報