我一直在嘗試使腳本能夠將一些檔案從一臺機器備份到另一臺機器,但遇到了問題。
基本上我想要做的是復制兩個檔案,一個.log 和一個(或多個).dmp。它們的格式始終如下:
something_2022_01_24.log something_2022_01_24.dmp
我想對這些檔案做三件事:
- 找到倒數第二個.log檔案(即something_2022_01_24.log是最新的,我想找到之前的那個說something_2022_01_22.log)
- 獲取僅包含日期的子字串 (2022_01_22)
- 復制與日期匹配的每個 .dmp(即 something_2022_01_24.dmp、something01_2022_01_24.dmp)
對于第一個我能找到的最好方法是: ls -t *.log | head-2 因為它顯示創建的倒數第二個檔案。
至于第二個,我更不知所措,因為我不確定如何決議第一個命令的輸出。
第三個我認為我可以用這樣的東西來管理:
[ -f "/var/www/my_folder/*$capturedate.dmp" ] && cp "/var/www/my_folder/*$capturedate.dmp" /tmp/
你們認為有什么辦法可以做到這一點?如何比較子字串?
謝謝!
uj5u.com熱心網友回復:
請您嘗試以下方法:
#!/bin/bash
dir="/var/www/my_folder"
second=$(ls -t "$dir/"*.log | head -n 2 | tail -n 1)
if [[ $second =~ .*_([0-9]{4}_[0-9]{2}_[0-9]{2})\.log ]]; then
capturedate=${BASH_REMATCH[1]}
cp -p "$dir/"*"$capturedate".dmp /tmp
fi
second=$(ls -t "$dir"/*.log | head -n 2 | tail -n 1)將選擇倒數第二個日志檔案。請注意,它假定檔案的時間戳自創建以來未修改,并且檔案名不包含特殊字符,例如換行符。這是一個簡單的 解決方案,我們可能需要對魯棒性進行更多改進。- 正則運算式
.*_([0-9]{4}_[0-9]{2}_[0-9]{2})\.log將匹配日志檔案名。它提取日期子字串(用括號括起來)并將 bash 變數分配${BASH_REMATCH[1]}給它。 - 然后下一個
cp命令將完成這項作業。請注意不要*在雙引號中包含通配符,以便正確擴展通配符。
僅供參考,這里有一些提取日期字串的替代方法。
與sed:
capturedate=$(sed -E 's/.*_([0-9]{4}_[0-9]{2}_[0-9]{2})\.log/\1/' <<< "$second")
使用 bash 的引數擴展(如果something不包括下劃線):
capturedate=${second%.log}
capturedate=${capturedate#*_}
使用cut命令(如果something不包括下劃線):
capturedate=$(cut -d_ -f2,3,4 <<< "${second%.log}")
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/422210.html
標籤:
