Digamos que eu tenha um diretório que contém outros diretórios e arquivos. Quero procurar uma string em cada arquivo e copiar apenas as linhas correspondentes para outro local, preservando a estrutura de diretórios.
Por exemplo, digamos que eu tenha esta estrutura
dir
subdir1
file1.txt
subdir2
file2.txt
e
file1.txt
:
abc
def
e
file2.txt
:
ghi
Agora quero obter apenas linhas correspondentes dos arquivos que contêm 'de', então o resultado que desejo deve ser assim:
dir
subdir1
file1.txt
subdir2
e
file1.txt
def
Responder1
Com 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\0' | xargs -0 mkdir -p
copie os arquivos com o padrão fornecido:
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)
restaure as permissões, assumindo Linux e supondo que você não tenha nomes de arquivos com novas linhas incorporadas:
cd "$src" getfacl -RPe . | (cd "$dest"; setfacl --restore=-)