폴더에 여러 개의 .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