como você grep o conteúdo de todos os arquivos em um diretório para "TEST" e depois move esses arquivos para um diretório diferente (como o diretório inicial)?
Responder1
Você pode combinargrepeencontrarpara esta tarefa:
find SOURCE -maxdepth 1 -type f -exec grep -q TEST {} \; -exec mv -i {} DEST \;
Como funciona
find SOURCE -maxdepth 1 -type f
encontra todos os arquivos (-type f
) no diretórioFONTE.Se você também quiser incluir arquivos em subdiretórios, basta remover
-maxdepth 1
.-exec grep -q TEST {} \;
greps os arquivos, um por um, para a stringTESTE. Aqui{}
está o arquivo que está sendo processado no momento.A
-q
opção torna o grep "silencioso", ou seja, não produzirá nada. A-exec
afirmação será verdadeira segrepé bem-sucedido, ou seja, encontra a string.-exec mv -i {} DEST \;
move um arquivo contendo a stringTESTEno diretórioDESTINO.A
-i
mudança fazmv"interativo", ou seja, irá perguntar antes de substituir outros arquivos.
Responder2
Apenas outra alternativa (isso requer algumas extensões específicas do GNU; já que você marcou a pergunta como "Unix", pode não ser adequado para você):
grep -lZd skip TEST SOURCE/* | xargs -0I{} mv -i {} DEST
grep -l
imprime nomes de arquivos correspondentes em vez da saída normal.
grep -Z
fornece saída separada por bytes nulos, o que é uma aposta segura no tratamento de nomes de arquivos estranhos em canais.
grep -d skip
define a
skip
ação para diretórios encontrados entre os argumentos de entrada.Isto não é realmente necessário; apenas evita o aviso
grep: SOURCE/DIR: Is a directory
ao encontrar diretórios. Se você deseja leitura recursiva de arquivos em diretórios, use o actionrecurse
, ou ainda mais curto, apenas a-r
opção equivalente (veja também o ponto abaixo).SOURCE/*
corresponde a todos os arquivos no diretório
SOURCE
usando shellglobulando. Arquivos ocultos não são correspondidos por padrão; isso pode ser alterado configurandoshopt -s dotglob
no Bash antes que ogrep
comando seja emitido.Pode-se ficar tentado a apenas adicionar
SOURCE/.*
argumentos de entrada, mas isso talvez tenha consequências inesperadas se usado com-r
(já que combinamos.
e..
também).Se a correspondência recursiva for desejada, basta usar
-r SOURCE
sem globbing de arquivo como argumento de entrada, que inclui arquivos ocultos na estrutura de diretórios.xargs -0
interpreta a entrada como separada por nulos.
xargs -I{}
define
{}
como um espaço reservado para o argumento de entrada.mv -i
torna o movimento interativo conforme sugestão de Dennis, para evitar erros.
Para testar esse padrão (ou comandos em geral), uma técnica útil é inserir echo
antes do comando real para ver quais comandos devem ser executados, ou seja, mudar mv
para echo mv
.
Responder3
$ mv TESTE* /caminho/para/destino
Funciona para mim, espero que funcione para você. No meu caso foi:
$ mv nota_[5,6]* ~/documentos/notas
Que moveu note_5_math.pdf e note_6_math.pdf para o diretório home/documents/notes.