
首先我要為我的知識匱乏表示歉意;這實際上是我的第一個 bash 腳本,而我的 Linux 知識基本上是不存在的。解釋性答案將不勝感激;我想了解為什麼而不僅僅是如何。
我正在嘗試編寫一個腳本來自動執行每天必須執行多次的繁瑣過程。簡而言之,這個腳本應該根據一定的要求準備一組文件。該腳本必須根據在特定目錄中找到的內容(例如,如果為空則創建,如果其中有內容則複製),將模板文件移入並為其分配版本號,或使用新版本號複製現有文件。
例如,該檔案可能被命名為
YYYYMMDD_##_使用者名稱_testfile.json
其中##(版本號)對於第一次建立應為01,然後對於副本應為02,對於之後的副本應為03,依此類推。具有不同的日期和順序版本號,以及使用相同格式但以 testfile.json 以外的其他內容結尾的其他文件
我似乎找不到一種方法讓腳本在目錄“test”中查找以 testfile.json 結尾且版本號最高的文件,如果找到,則將版本號提取為變量/參數,我可以通過回到cp序列。
此時我甚至不確定要使用什麼命令;互聯網提供了從 grep 到 awk 到列表和排序的一切...我的頭在旋轉!
任何幫助,將不勝感激。我已刪除所有識別信息,如果您需要更多信息,請告訴我。
答案1
讓我們將其分解為多個步驟。
我們將編寫一個傳回下一個數字的函數。我們的目標是簡單,而不是最大效率
您需要給它一個目錄名稱
您需要給它testfile.json
檔案名稱的一部分
我們需要找到該目錄中以該結尾結尾的所有檔案。
使用 $1、$2 等將參數傳遞到函數中。
getnum(){
ls "$1" | grep "$2\$"
}
使用 cut 只取出第二個字段,用作_
分隔符號。 (請注意,如果我要這樣做,我會使用 sed 而不是 grep 和 cut,其他人可能會使用 awk,但我們在這裡是為了簡單起見)。
getnum() {
ls "$1" | grep "$2\$" | cut -d_ -f 2
}
使用 sort 對它們進行數字排序
getnum() {
ls "$1" | grep "$2\$" | cut -d_ -f 2 | sort -n
}
使用 head 只取得第一個值
getnum() {
ls "$1" | grep "$2\$" | cut -d_ -f 2 | sort -n | head -1
}
將其包裝起來,以便我們獲得局部變數中的值
getnum() {
local oldnum=$(ls "$1" | grep "$2\$" | cut -d_ -f 2 | sort -n | head -1)
}
如果沒有值,則將舊值設為 0。
getnum() {
local oldnum=$(ls "$1" | grep "$2\$" | cut -d_ -f 2 | sort -n | head -1)
if [ "$oldnum" = "" ]
then
oldnum=0
fi
printf "%02d\n" $(($oldnum+1))
}
請注意,我可以省略對未設定 oldnum 的測試,因為在這種情況下$((oldnum+1))
將擴展為。$((+1))
我還可以使用 $((${oldnum:-0}+1)) 等表達式,請參閱手冊以獲取更多資訊。
然後你可以使用這樣的函數
dir=somewhere/logs
ext=testfile.json
cp template "$dir/$(date +%Y%m%d_)$(getnum "$dir" "$ext")_$USER_$ext"