rm todos os arquivos à direita de “==” impressos na tela

1

Eu tenho um script que imprime:

dhcp-18-189-47-44:CE06_getting_new_fit myname$ ./find-duplicate-structures.sh custom_structures new_GS_calculation/selected/POSCAR_00*
../CE05-structures_recombined/enum-00135/POSCAR.ideal == new_GS_calculation/selected/POSCAR_0011 (RMSD = 1.15475827927e-06, max. displacement = 1.41428428091e-06)
../CE05-structures_recombined/enum-00146/POSCAR.ideal == new_GS_calculation/selected/POSCAR_0022 (RMSD = 1.16051714442e-06, max. displacement = 1.42835572031e-06)
../CE05-structures_recombined/enum-00150/POSCAR.ideal == new_GS_calculation/selected/POSCAR_0027 (RMSD = 3.40556388834e-16, max. displacement = 6.04819551804e-16)
../CE05-structures_recombined/enum-00151/POSCAR.ideal == new_GS_calculation/selected/POSCAR_0027 (RMSD = 4.01650747941e-16, max. displacement = 5.4726685759e-16)
../CE05-structures_recombined/enum-00163/POSCAR.ideal == new_GS_calculation/selected/POSCAR_0037 (RMSD = 1.99174954223e-06, max. displacement = 2.44948961046e-06)

internamente, o script se parece com:

dirs=$1
shift
while read dir
do
if [ -f $dir/POSCAR.ideal ]
then poscar=$dir/POSCAR.ideal
else poscar=$dir/POSCAR
fi
mg match --just-match $poscar $@
done < $dirs

exit 0

A impressão ocorre na partida mg de linha - basta combinar $ poscar $ @

No entanto, na minha prática, gostaria de remover tudo para a direita "==", ou seja:

rm new_GS_calculation/selected/POSCAR_0011
rm new_GS_calculation/selected/POSCAR_0022
rm new_GS_calculation/selected/POSCAR_0027
rm new_GS_calculation/selected/POSCAR_0037

Como eu poderia automatizar esse processo no shell script? Obrigado.

    
por user40780 27.08.2015 / 19:04

1 resposta

2

Você pode tentar analisar a saída do seu programa com sed e executar os comandos:

$(./YOUR_PROGRAM | sed s/^.*==/rm/ | sed s/\ \(.*//)

será executado (do seu exemplo)

rm new_GS_calculation/selected/POSCAR_0011
rm new_GS_calculation/selected/POSCAR_0022
rm new_GS_calculation/selected/POSCAR_0027
rm new_GS_calculation/selected/POSCAR_0027
rm new_GS_calculation/selected/POSCAR_0037

sed funciona com a seguinte sintaxe:
sed s/string1/string2/

que substitui string1 por string2 .

O que está acontecendo aqui é:

  1. a saída do seu programa é enviada para sed com o primeiro canal |
  2. para cada linha de saída, sed desde o início (marcado por ^ ) para o sinal == e o substitui pelas letras rm . isto envia o resto da linha para outra chamada sed com um segundo cano
  3. sed agora procura e remove um espaço seguido por uma esquerda parênteses, denotado por \ \( , e qualquer coisa que se segue, denotada por .* .
  4. o comando inteiro é empacotado em $(...) , então o bash executa o saída, que neste caso, uma string de rm new_GS_calculation/... comandos.
por 27.08.2015 / 19:10