Encontrando uma string em um arquivo dentro de um diretório e movendo o arquivo inteiro para uma nova pasta

0

Eu prefiro prefaciar o fato de que sou muito novo para realmente trabalhar profundamente com o bash e o Linux, portanto, qualquer ajuda seria imensa, mesmo em dicas iniciais que funcionassem para você.

O problema que tenho é que estou trabalhando com diretórios e subdiretórios. Eu estou tentando o grep fora de linha.

grep 'Relaxed' */*

Não é elegante, mas me dá uma lista de diretórios que contêm um arquivo que tem a linha Relaxado (no meu caso, é uma saída de um cálculo de previsão de estrutura eletrônica). Eu tenho cerca de 100+ desses diretórios para classificar os que são feitos e quais não são tediosos.

O que eu estou esperando ajuda é um método para pesquisar em cada um desses diretórios e quando a string, por exemplo:

Coordenadas atômicas relaxadas (fracionárias):

é encontrado dentro de um arquivo (relaxado é o suficiente de uma linha para reconhecer) nesse diretório use um loop for ou algo para mover todo o diretório para o pile (outro diretório) e deixar os incompletos no diretório como estão. Então eu vou ter uma pilha de diretórios que são "feitos" e os intocados que eu posso re-executar.

Mais uma vez qualquer ajuda seria apreciada e eu posso esclarecer se alguma coisa parece confusa.

Obrigado!

    
por Alastair Price 25.01.2018 / 01:51

1 resposta

0
grep -rl 'Relaxed' | xargs dirname | xargs  mv -vt donedirectory

Em câmera lenta:

  • grep -rl 'Relaxed' pesquisa todos os arquivos e imprime seus nomes. Se eles estiverem todos no subdiretório de primeiro nível do seu diretório atual, usar grep -l 'Relaxed' */* também será possível.
  • xargs dirname chama dirname com cada arquivo dessa saída para imprimir o nome do diretório
  • xargs mv -v -t donedirectory move todos os diretórios resultantes para o diretório de destino.

Se vários arquivos com "Relaxed" puderem ser encontrados no mesmo diretório, você poderá evitar mensagens de erro tornando os nomes de diretórios exclusivos:

grep -rl 'Relaxed' | xargs dirname | sort -u | xargs  mv -vt donedirectory

Nota: o comando acima assume que não há nasties em nomes de arquivos / diretórios (espaços, etc ...).

    
por 25.01.2018 / 08:24