Eu tenho um monte de arquivos .tcx (essencialmente um arquivo XML de saída do dispositivo GPS) em uma pasta. Eles seguem a convenção de nomenclatura DATE_LOCATION_SPORT.tcx. Cada arquivo tem um monte de nós de track-point notando os principais dados de GPS como gravados a cada segundo, dentro do qual existe um nó de distância até agora chamado de "DistanceMeters". Eu quero percorrer cada arquivo e encontrar o último nó "DistanceMeters" e, em seguida, a saída dessa lista de distâncias. Aqui está um trecho de um arquivo. (Estou usando o terminal OS X Sierra)
…
<Trackpoint>
<Time>2017-04-09T08:15:29.000Z</Time>
<Position>
<LatitudeDegrees>0.123456</LatitudeDegrees>
<LongitudeDegrees>-0.654321</LongitudeDegrees>
</Position>
<AltitudeMeters>24.363636363636363</AltitudeMeters>
<DistanceMeters>1382.3235298511217</DistanceMeters>
<HeartRateBpm xsi:type="HeartRateInBeatsPerMinute_t">
<Value>130</Value>
</HeartRateBpm>
</Trackpoint>
…
Comecei tentando fazer isso com apenas um arquivo (note que alguns dos nomes de arquivos têm espaços, não tenho certeza se isso está me atrapalhando);
grep '<DistanceMeters>.*<\/DistanceMeters>' '2017-03-23_Somewhere_Running.tcx' | tail -1 | grep -o '[0-9]\+\.[0-9]\+'
Que muito bem recebe o último nó "DistanceMeters" e, em seguida, usa o grep para extrair a distância numérica em vez da linha inteira de xml.
find . -iname '2017*_Running.tcx'
O texto acima me fornece uma lista de todos os arquivos em que estou interessado neste ano.
Mas quando tento combinar os comandos, tudo desmorona. Ou recebo um erro sobre não terminar em "\;" ou, eu recebo uma resposta, mas apenas o último valor de distância para o último arquivo na lista de arquivos, ao invés de uma distância para cada um.
Então, isso me dá a distância final do último arquivo na lista;
find . -iname '*_Running.tcx' -print0 | xargs -0 grep '<DistanceMeters>.*<\/DistanceMeters>' | tail -1 | grep -o '[0-9]\+\.[0-9]\+'
Como isso acontece?
find . -iname '*_Running.tcx' -exec grep '<DistanceMeters>.*<\/DistanceMeters>' {} \; | tail -1 | grep -o '[0-9]\+\.[0-9]\+'
Eu tentei várias combinações, mas não sei como combiná-las da maneira que preciso. Eu pensei que talvez colocar o "\" no final faria isso, mas isso não funciona - reclama de não terminar em ";" ou "+".
find . -iname '*_Running.tcx' -exec grep '<DistanceMeters>.*<\/DistanceMeters>' {} | tail -1 | grep -o '[0-9]\+\.[0-9]\+' \;
rendimentos
grep: ;: No such file or directory
find: -exec: no terminating ";" or "+"
Alguma idéia?
Obrigado por ler isto até agora!