Com o GNU find(1) , xargs(1) e grep(1) :
-
duplique a estrutura de diretórios:
src=/path/to/source dest=/other/path/to/destination pat='some_grep_pattern' cd "$dest" find "$src" -type d ! -path "$src" -printf '%P
' | xargs -0 mkdir -pcd "$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) -
copie os arquivos com o padrão fornecido:
cd "$src" getfacl -RPe . | (cd "$dest"; setfacl --restore=-) -
restaurar permissões, assumindo o Linux, e assumindo que você não tem nomes de arquivos com novas linhas embutidas:
src=/path/to/source dest=/other/path/to/destination pat='some_grep_pattern' cd "$dest" find "$src" -type d ! -path "$src" -printf '%P
' | xargs -0 mkdir -pcd "$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)