在資料夾中搜尋一堆 GPS 檔案以獲取最終距離,輸出距離列表

在資料夾中搜尋一堆 GPS 檔案以獲取最終距離,輸出距離列表

我的資料夾中有一堆 .tcx 檔案(本質上是 GPS 裝置輸出的 XML 檔案)。它們遵循命名約定 DATE_LOCATION_SPORT.tcx。每個檔案都有一堆追蹤點節點,記錄每秒記錄的關鍵 GPS 數據,其中有一個子節點,稱為「DistanceMeters」。我想 grep 遍歷每個文件,找到最後一個“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

相關內容