폴더에 있는 여러 GPS 파일에서 최종 거리를 검색하고 거리 목록을 출력합니다.

폴더에 있는 여러 GPS 파일에서 최종 거리를 검색하고 거리 목록을 출력합니다.

폴더에 여러 개의 .tcx 파일(기본적으로 GPS 장치에서 출력되는 XML 파일)이 있습니다. 이름 지정 규칙 DATE_LOCATION_SPORT.tcx를 따릅니다. 각 파일에는 "DistanceMeters"라는 하위 거리 노드와 함께 매초 기록되는 주요 GPS 데이터를 기록하는 여러 개의 트랙포인트 노드가 있습니다. 각 파일을 살펴보고 마지막 "DistanceMeters" 노드를 찾은 다음 해당 거리 목록을 출력하고 싶습니다. 이것은 파일의 일부입니다. (저는 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>

나는 처음에 단 하나의 파일로 이 작업을 시도했습니다(일부 파일 이름에는 공백이 포함되어 있으므로 혼란스러울지 모르겠습니다).

grep '<DistanceMeters>.*<\/DistanceMeters>' '2017-03-23_Somewhere_Running.tcx' | tail -1 | grep -o '[0-9]\+\.[0-9]\+'

마지막 "DistanceMeters" 노드를 가져온 다음 grep을 사용하여 xml의 전체 줄 대신 숫자 거리를 추출하는 데 효과적입니다.

find . -iname '2017*_Running.tcx'

위에 나열된 파일은 올해 제가 관심을 갖고 있는 모든 파일입니다.

하지만 이 명령들을 결합하려고 하면 모든 것이 무너집니다. "\;"로 끝나지 않는다는 오류가 발생하거나 답변을 얻지만 각 파일의 거리가 아닌 파일 목록의 마지막 파일에 대한 마지막 거리 값만 얻습니다.

따라서 이것은 목록에 있는 마지막 파일의 최종 거리를 제공합니다.

find . -iname '*_Running.tcx' -print0 | xargs -0 grep '<DistanceMeters>.*<\/DistanceMeters>' | tail -1 | grep -o '[0-9]\+\.[0-9]\+'

바로 이렇습니다.

find . -iname '*_Running.tcx' -exec grep '<DistanceMeters>.*<\/DistanceMeters>' {} \; | tail -1 | grep -o '[0-9]\+\.[0-9]\+'

다양한 조합을 시도했지만 필요한 방식으로 조합하는 방법을 잘 모르겠습니다. 끝에 "\;"를 추가하면 된다고 생각했지만 작동하지 않습니다. ";" 또는 "+"로 끝나지 않는다고 불평합니다.

find . -iname '*_Running.tcx' -exec grep '<DistanceMeters>.*<\/DistanceMeters>' {} | tail -1 | grep -o '[0-9]\+\.[0-9]\+' \;

생산하다

grep: ;: No such file or directory
find: -exec: no terminating ";" or "+"

어떤 아이디어가 있나요?

이 기사를 읽어주셔서 감사합니다!

답변1

여기서 문제는 인용입니다... find(1)의 'exec' 옵션이 명령 파이프를 허용하도록 올바르게 인용하는 방법이 있는지 모르겠습니다.

문제를 해결하는 한 가지 방법은 다음과 같습니다.

$ for rfile in $(find . -iname '2017*_Running.tcx'); do grep '<DistanceMeters>.*<\/DistanceMeters>' $rfile | tail -1 | grep -o '[0-9]\+\.[0-9]\+'; done

관련 정보