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