Linux

如何從 shell 腳本中獲取遠端文件修改時間和大小?

  • September 28, 2019

我有一個Linux VPS,上面有很多HTML表單,如下:

<table>
   <thead>
       <tr>
           <th>ver</th>
           <th>link</th>
       </tr>
   </thead>
   <tbody>
       <tr>
           <td>1.0.1</td>
           <td><a href="http://speedtest.tokyo2.linode.com/100MB-tokyo2.bin">download</a></td>
       </tr>
       <tr>
           <td>1.0.2</td>
           <td><a href="http://speedtest.singapore.linode.com/100MB-singapore.bin">download</a></td>
       </tr>
       <tr>
           <td>1.0.3</td>
           <td><a href="http://speedtest.fremont.linode.com/100MB-fremont.bin">download</a></td>
       </tr>
       <tr>
           <td>1.0.4</td>
           <td><a href="http://speedtest.dallas.linode.com/100MB-dallas.bin">download</a></td>
       </tr>
       <tr>
           <td>1.0.5</td>
           <td><a href="http://speedtest.atlanta.linode.com/100MB-atlanta.bin">download</a></td>
       </tr>
   </tbody>
</table>

表格比較簡單,只有版本號和文件下載連結。

我想使用 shell 腳本訪問表中的 URL,以獲取遠端文件的日期和大小,然後將此資訊更新到表中。

它們最終將如下所示:

在此處輸入圖像描述

問問題之前,我查看了curl和wget文件,其中curl測試可以查看標準輸出中的文件資訊,但不知道如何編寫自動化腳本來完成這個任務。剛接觸Linux,希望能得到大家的幫助,謝謝!

這將返回您可以從標頭中獲取的文件資訊:

curl --head http://speedtest.newark.linode.com/100MB-newark.bin

它將返回:

HTTP/1.1 200 OK
Server: nginx
Date: Sat, 28 Sep 2019 12:47:03 GMT
Content-Type: application/octet-stream
Content-Length: 104857600
Last-Modified: Thu, 01 Aug 2019 16:35:25 GMT
Connection: keep-alive
ETag: "5d4314cd-6400000"
Accept-Ranges: bytes

如果這是您需要的,您可以編寫一個 bash 腳本來生成包含該資訊的 table/html 文件。

您可以在這樣的腳本中使用它:

#!/bin/sh

cat  << EOF
<table>
   <thead>
       <tr>
           <th>ver</th>
           <th>link</th>
           <th>modified</th>
           <th>size</th>
       </tr>
   </thead>
   <tbody>
EOF

$i=1

cat urls.list | while read url
do
       file_info=$(curl -s --head "$url")
       last_modified=$(echo "$file_info" | grep Last-Modified | cut -c16- | tr -d '\r\n')
       content_length=$(echo "$file_info" | grep Content-Length | cut -c17- | tr -d '\r\n')

cat  << EOF
       <tr>
           <td>1.0.$i</td>
           <td><a href="$url">download</a></td>
           <td>$last_modified</td>
           <td>$content_length</td>
       </tr>
EOF
let "i++"
done

cat << EOF
   </tbody>
</table>
EOF

您需要創建一個名為的文件,該文件urls.list每行應包含一個 url。像那樣:

http://speedtest.newark.linode.com/100MB-newark.bin
http://speedtest.tokyo2.linode.com/100MB-tokyo2.bin

執行腳本將產生如下輸出:

<table>
   <thead>
       <tr>
           <th>ver</th>
           <th>link</th>
           <th>modified</th>
           <th>size</th>
       </tr>
   </thead>
   <tbody>
       <tr>
           <td>1.0.1</td>
           <td><a href="http://speedtest.newark.linode.com/100MB-newark.bin">download</a></td>
           <td>Thu, 01 Aug 2019 16:35:25 GMT</td>
           <td>104857600</td>
       </tr>
   </tbody>
</table>

如果您需要特定的版本名稱,您可以將其儲存在帶有分隔符的列表文件中(例如:)version name|url。並且需要稍微調整程式碼。現在,它只是遵循 url 列表的順序。

引用自:https://unix.stackexchange.com/questions/544186