move o conteúdo da pesquisa para um diretório diferente

3

Estou no Oracle Solaris.

Estou usando:

grep "searchstring" filename.*
O comando

acima retorna meu resultado de pesquisa.

Agora quero mover todos os arquivos acima do resultado da pesquisa (todos os arquivos e não o resultado da pesquisa) para um diretório específico ../mydir/ .

Como posso conseguir isso em um comando (pesquisar e mover ambos devem ser feitos em um comando de linha).

    
por user73352 26.06.2014 / 11:08

1 resposta

3

A partir de ksh , bash ou /usr/xpg4/bin/sh , assumindo que os nomes de arquivos não contenham caracteres de nova linha, você pode usar o operador split + glob na saída de grep -l ( -l to l é os arquivos que correspondem).

Esse operador é chamado deixando a substituição do comando ( '...' ou $(...) ) sem aspas. Aqui, ajustamos com a variável $IFS special para dizer qual caractere queremos dividir (aqui o caractere de nova linha) e desativando a parte glob com set -f :

IFS='
'
set -f
mv $(set +f; grep -l searchstring filename*) ../mydir/

(restauramos globbing dentro da substituição do comando (que é executado em um subshell) para a expansão de filename* ).

Você pode simplificá-lo para:

mv $(grep -l searchstring filename*) ../mydir/

Se você sabe que os nomes dos arquivos não contêm espaço, guia, nova linha, * , ? ou [ caracteres. Acima a divisão é feita em caracteres newline, space e tab (que é o valor padrão de $IFS ) e globbing é executado em cada palavra resultante dessa divisão (mas isso não é um problema se nenhum dos nomes de arquivo contiver caracteres curinga).

Se você não pode garantir que os nomes dos arquivos não contenham caracteres de nova linha, você pode usar um loop:

for f in filename*; do
  grep -q searchstring "$f" && mv "$f" ../mydir/
done
    
por 26.06.2014 / 11:10