Bash
比較 2 個文件並在有差異時執行腳本
我有一個用於處理文本轉換的 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=%s
which 直接使用有關文件的元數據來給出總大小(以字節為單位)。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。請注意,更改的行將僅在第一個文件中由一行表示,而另一行僅在第二個文件中表示。