Bash

比較 2 個文件並在有差異時執行腳本

  • October 17, 2019

我有一個用於處理文本轉換的 shell 腳本,但是使用起來很麻煩,並且依賴於人工判斷和執行。它的工作原理如下。

第 1 步:下載原始數據文本。

wget http://example.com/raw.txt

第 2 步:手動比較上次下載文件的內容是否存在差異。

文本的內容格式比較簡單,每行一個字元串。如果內容有所增加,則需要執行腳本處理。

# Last downloaded file content:
wtKpjv
uJlQm1
iS86aE
Hk6ycS
hAYj7k

# Now downloaded file content:
wtKpjv
uJlQm1
RiU8iM
iS86aE
Hk6ycS
qyDNaZ
hAYj7k

# Compare the increased content:
RiU8iM
qyDNaZ

第三步:如果對比結果有差異,需要執行腳本處理。

./text_processing.sh raw.txt > new.text

以上是我目前的使用步驟。如何設置自動化任務來完成此過程?

我想每天檢查一次。如果文本內容更新,我需要立即執行腳本。如果沒有更改,則腳本每 3 天執行一次。

如果有人可以幫助我,我將不勝感激..

您的問題對您的要求有點模糊。

如果您只想檢查任何差異,請使用cmp -s oldfile newfile. 如果文件相同,它將以真實狀態退出:

if cmp -s oldfile newfile
then echo files are the same
else echo files are different
    ./text_processing.sh ...
fi

如果要檢查文件大小是否增加,則可以使用wc -c(for character count)、wc -l(for line count) 或stat --format=%swhich 直接使用有關文件的元數據來給出總大小(以字節為單位)。

if [ $(wc -c oldfile) -lt $(wc -c newfile) ]
then echo oldfile is smaller
    ./text_processing.sh ...
fi

$( ... )執行附帶的命令並將其輸出替換為命令行。[ ... -lt ... ]測試第一個參數是否小於第二參數。

如果您特別想檢查是否添加了一行,那麼最好的策略可能是首先對兩個文件進行排序,然後使用comm過濾掉常見的行:

sort -o oldfile.sorted oldfile
sort -o newfile.sorted newfile
if [ $(comm -13 oldfile.sorted newfile.sorted | wc -l) -gt 0 ]
then echo 'line(s) only found in newfile'
    ./text_processing.sh ...
fi

comm -13匹配兩個文件中的行。通常每行都會輸出,並帶有一個縮進來指示該行是只出現在第一個文件中,還是只出現在第二個文件中,或者兩者都出現。由於-13僅來自第一個文件的行和公共行被抑制,因此僅輸出第二個文件中出現的那些行。那是通過管道輸入wc -l的,它計算行數,並且被測試為大於 0。

請注意,更改的行將僅在第一個文件中由一行表示,而另一行僅在第二個文件中表示。

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