como usar grep e mv juntos em um diretório no shell?

como usar grep e mv juntos em um diretório no shell?

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 fencontra 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 -qopção torna o grep "silencioso", ou seja, não produzirá nada. A -execafirmação será verdadeira segrepé bem-sucedido, ou seja, encontra a string.

  • -exec mv -i {} DEST \;move um arquivo contendo a stringTESTEno diretórioDESTINO.

    A -imudanç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 skipaçã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 directoryao encontrar diretórios. Se você deseja leitura recursiva de arquivos em diretórios, use o action recurse, ou ainda mais curto, apenas a -ropção equivalente (veja também o ponto abaixo).

  • SOURCE/*

    corresponde a todos os arquivos no diretório SOURCEusando shellglobulando. Arquivos ocultos não são correspondidos por padrão; isso pode ser alterado configurando shopt -s dotglobno Bash antes que o grepcomando 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 SOURCEsem 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 echoantes do comando real para ver quais comandos devem ser executados, ou seja, mudar mvpara 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.

informação relacionada