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