BASH Shell 腳本輔助,備份腳本從文件名中提取元數據並相應地移動文件
所以我需要建構一個shell腳本(我很垃圾的一項技能,我認為太線性了,把所有東西都變成管道),它將連接到遠端機器到一個特定的目錄,抓取所有超過5分鐘的文件,從中提取資訊文件的名稱(下面的編碼詳細資訊)並將文件分散到相關目錄中,或者如果本地備份主機上不存在這些目錄,則創建這些目錄。
在十幾台機器上,我有一個目錄(讓我們稱之為 /Prod/Data/),其中包含數千個名為 data-HOST-v.7.mmddyy.csv 的文件
範例:date-web2-v.7.052509.csv
超過 5 分鐘的文件需要從遠端機器拉到本地文件夾 /backup/archive/host/year/month/day/csvs
範例 /backup/archive/web2/2009/05/29/csvs
我確定我可以做類似 ls -1 | 剪切-d"。" -f3 提取文件的日期部分,然後使用 sed 或 awk 隔離每個部分並生成日期變數以選擇將文件轉儲到的目錄,執行類似抓取主機的操作,但我不知道如何著手將其與要在其上執行移動的文件相關聯。不知道如何遠端執行,也許最好先從遠端機器上 scp 所有文件(缺少任何小於 5 分鐘的文件,也許可以使用 find -mmin +5 語句來解決這個問題?)然後在所有東西都在備份機器上時進行排序。
有人會這麼好心地向我指出可能提供類似功能的範例腳本的方向嗎?我寫的一切都傾向於命令| 命令 | 命令 | 等等……我想這個任務需要一些維度。
感謝您的時間。
純 Bash 解決方案,使用參數擴展。有關PE 的說明,請參閱此內容。
foo='date-web2-v.7.052509.csv' file=${foo%*.csv} date=${file##*.} month=${date:0:2} day=${date:2:2} year=${date:4:2}
我可能會為此使用 Perl 並使用括號從正則表達式中擷取我想要的組。
find命令具有根據年齡選擇文件的選項。請參閱 -amin、-atime、-cmin、-ctime、-mmin 和 -mtime 選項。
您可以使用 find 來建構您需要移動的文件列表,將其儲存到文件中,然後在帶有 –include-from= 和 –remove-source-files 選項的 rsync 命令中使用它。