
Estou no Oracle Solaris.
Estou usando:
grep "searchstring" filename.*
O comando acima retorna meu resultado de pesquisa.
Agora quero mover todos os arquivos no resultado da pesquisa acima (todos os arquivos, não o resultado da pesquisa) para um diretório específico ../mydir/
.
Como posso fazer isso em um comando (pesquisar e mover ambos devem ser feitos em um comando de linha).
Responder1
De ksh
, bash
ou /usr/xpg4/bin/sh
, assumindo que os nomes dos arquivos não contenham caracteres de nova linha, você pode usar o operador split+glob na saída de grep -l
( -l
paraeusão os arquivos que correspondem).
Esse operador é invocado deixando osubstituição de comando( `...`
ou $(...)
) sem aspas. Aqui, nós o ajustamos com a $IFS
variável especial para dizer em qual caractere queremos dividir (aqui o caractere de nova linha) e desativando a glob
parte com set -f
:
IFS='
'
set -f
mv $(set +f; grep -l searchstring filename*) ../mydir/
(restauramos globbingdentroda 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, tabulação, nova linha *
ou caracteres. Acima, a divisão é feita em caracteres de nova linha, espaço e tabulação (que é o valor padrão de ) e o globbing é executado em cada palavra resultante dessa divisão (mas isso não é um problema se nenhum dos nomes de arquivos contiver caracteres curinga).?
[
$IFS
Se você não puder garantir que os nomes dos arquivos não conterão caracteres de nova linha, você poderá usar um loop:
for f in filename*; do
grep -q searchstring "$f" && mv "$f" ../mydir/
done