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)