O comando grep para localizar arquivos contendo texto e movê-los

11

Eu posso localizar arquivos em uma pasta contendo uma string de texto específica usando este comando:

grep -lir 'string' ~/directory/*

Como faço para mover os arquivos que aparecem no resultado acima para outro local?

    
por Spartanblogger 27.11.2012 / 18:14

6 respostas

7

Como sempre, tenha cuidado com grep -r . -r não é uma opção padrão, e em algumas implementações como todas as versões muito recentes do GNU grep , segue links simbólicos ao descer a árvore de diretórios, o que geralmente não é o que você quer e pode ter implicações severas se, por exemplo há um link simbólico para "/" em algum lugar na árvore de diretórios.

Na filosofia Unix, você usa um comando para procurar diretórios por arquivos e outro para ver seu conteúdo.

Usando as ferramentas do GNU, eu faria:

xargs -r0 --arg-file <(find . -type f -exec grep -lZi string {} +
  ) mv -i --target-directory /dest/dir

Mas, mesmo assim, tenha cuidado com as condições de corrida e possíveis problemas de segurança, se você executá-lo como um usuário em um diretório gravável por outro usuário.

    
por 27.11.2012 / 18:52
13

Use xargs em sintonia com a terceira sintaxe do mv : mv [OPTION]... -t DIRECTORY SOURCE...

grep -lir 'string' ~/directory/* | xargs mv -t DEST

Tenha cuidado com arquivos que contenham caracteres especiais (espaços, aspas). Se esse for o seu caso, filtrar a lista com sed (adicionando citações em torno de nomes de arquivos com s/^/'/;s/$/'/ ) pode ajudar, mas você precisa ter certeza de que essas citações não aparecerão nos nomes dos arquivos. O GNU grep possui a opção -Z / --null para nomes de arquivos com terminação NUL.

Uma alternativa à terceira sintaxe para mv é usar xargs com a string de espaço reservado ( -I ).

Outra opção é a substituição de comandos - $( ) ou backticks '' (no bash) como mencionado na resposta de ire_and_curses.

    
por 27.11.2012 / 18:25
6

Se os nomes dos seus arquivos não contiverem caracteres especiais (espaço em branco ou \[*? ), use a substituição de comandos :

mv 'grep -lir 'string' ~/directory/*' destination/
    
por 27.11.2012 / 18:17
1

Usando apenas recursos especificados POSIX e fazendo suposições no sobre nomes de arquivos:

find ~/directory -type f -exec grep -qiF 'string' {} \; -exec mv {} /path/to/dest \;

Notas:

Você disse "string" e não "padrão", então a opção -F (pesquisa de string fixa) de grep parece apropriada.

Se o seu diretório de destino estiver em qualquer lugar dentro de seu diretório de pesquisa, você poderá ter algumas condições de corrida desagradáveis.

especificações POSIX para grep

especificações POSIX para find

    
por 09.11.2016 / 10:35
0

Usando o paralelo GNU :

grep -i -Z -r -l 'string' . | parallel 'mv {} destination/{}'

ht / @ lin-dong para sua resposta original com xargs.

    
por 01.08.2016 / 21:22
0

-Assumir que você tem diretório de destino como 'externo' e precisa mover todos os arquivos XLS, você pode tentar o comando abaixo

sudo mv find /var/log/ -type f -name "*.xls" / external /

    
por 01.11.2018 / 10:41

Tags