【shell腳本編程】day1 備份指定文件類型

文章目錄

    • 1、腳本要求
    • 2、腳本編寫
    • 3、腳本解釋
    • 4、腳本改進

1、腳本要求

  • 編寫一個腳本,遍歷/data/目錄下的.txt文件
  • 將這些txt文件做一個備份
  • 備份的文件名增加一個年月日的后綴,比如將aming.txt備份為aming.txt_20231001

2、腳本編寫

[root@localhost shell]# cat bak.sh 
#!/bin/bashsuffix=`date +%Y%m%d`for f in `find /data/ -type f -name "*.txt"`doecho "備份文件$f"cp ${f}   ${f}_${suffix} 
done
[root@localhost shell]# 

3、腳本解釋

這段 Bash 腳本的功能是為/data/目錄下全部的.txt文件創建帶日期后綴的備份。下面是對代碼的詳細解釋:

獲取當前日期:

suffix=`date +%Y%m%d`

借助date命令得到當前日期,并且把格式設定為YYYYMMDD,然后將結果存到變量suffix里。

查找目標文件:

for f in `find /data/ -type f -name "*.txt"`

運用find命令來查找/data/目錄下所有類型為文件(-type f)、名字以.txt結尾(-name “*.txt”)的文件。隨后,針對每個查找到的文件,都會執行一次循環體。

備份文件:

echo "備份文件$f"
cp ${f}   ${f}_${suffix} 

在循環體中,首先會輸出正在備份的文件名稱,然后使用cp命令進行文件復制操作。復制時,會在原文件名后面加上_YYYYMMDD這樣的日期后綴,以此來創建備份文件。
代碼潛在問題
變量引用存在風險:

for f in `find /data/ -type f -name "*.txt"`

要是文件名里包含空格或者特殊字符,這種寫法就可能使循環處理文件時出現錯誤。

缺少錯誤處理機制:

cp ${f}   ${f}_${suffix} 

當復制過程中出現錯誤(例如權限不足、磁盤空間不夠)時,腳本不會進行任何處理,而是會繼續執行后續操作。

未考慮子目錄情況:
如果/data/目錄下存在子目錄,備份文件會和原文件處于同一目錄,這樣可能會讓目錄結構變得混亂。

4、腳本改進

#!/bin/bashsuffix=$(date +%Y%m%d)
backup_dir="/data/backup/"# 創建備份目錄(如果不存在)
mkdir -p "$backup_dir"# 使用安全的方式查找文件
find /data/ -type f -name "*.txt" -print0 | while IFS= read -r -d '' file; do# 提取文件名和目錄filename=$(basename "$file")filedir=$(dirname "$file")# 構建備份文件名backup_file="${backup_dir}/${filename}_${suffix}"echo "備份文件: $file$backup_file"# 執行備份并檢查結果if cp "$file" "$backup_file"; thenecho "成功備份: $file"elseecho "備份失敗: $file" >&2fi
done
改進內容說明
采用安全的文件處理方式:
運用-print0和read -d ''來處理包含空格的文件名。
借助basename和dirname來分別處理文件名和目錄路徑。
創建專門的備份目錄:
把所有備份文件都存放到/data/backup/目錄中,避免原目錄結構變得混亂。
添加錯誤處理:
對cp命令的執行結果進行檢查,并且輸出相應的成功或失敗信息。
使用現代命令替換語法:
把反引號替換成$(...),提升代碼的可讀性。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/90356.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/90356.shtml
英文地址,請注明出處:http://en.pswp.cn/web/90356.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Gata 攜手 Walrus 構建 AI 的開放執行基礎設施

致力于開發去中心化大模型推理、訓練和數據技術的 Gata,現已整合 Walrus,作為其 AI 開放執行基礎設施的核心組件。Walrus 將為 Gata 的首款產品 DataAgent 提供關鍵的數據層,助力其全套應用,將去中心化 AI 的優勢直接帶給用戶&…

DNS及DNS域名解析流程

文章目錄什么是DNS域名解析DNS服務器DNS域名解析流程什么是DNS域名解析 我們首先要了解域名和IP地址的區別。IP地址是互聯網上計算機唯一的邏輯地址,通過IP地址實現不同計算機之間的相互通信,每臺聯網計算機都需要通過IP地址來互相聯系和分別。 但由于I…

用 STM32 的 SYSTICK 定時器與端口復用重映射玩轉嵌入式開發

目錄 1. SYSTICK 定時器的基本功:時間管理大師 1.1 SYSTICK 的核心寄存器與工作原理 1.2 配置 SYSTICK 的正確姿勢 1.3 實戰:用 SYSTICK 實現精準延時 1.4 小技巧:SYSTICK 的低功耗優化 2. SYSTICK 中斷:讓你的程序“活”起來 2.1 配置 SYSTICK 中斷 2.2 實戰:用 S…

Sa-Token:輕量級Java權限認證框架使用指南

一、Sa-Token簡介 Sa-Token 是一個專注于權限認證的輕量級 Java 框架,旨在簡化登錄認證、權限控制等功能的實現。其核心功能包括: 登錄認證:通過 Token 機制管理用戶會話,支持單點登錄(SSO)。權限認證&am…

動態 vs 靜態住宅代理,哪種更適合廣告投手?

在廣告投放行業,無論你是跑Facebook、Google Ads,還是做TikTok、原生廣告,代理IP幾乎是繞不開的話題。而選擇動態住宅代理還是靜態住宅代理,對廣告賬戶的穩定性、投放質量甚至生命周期都有直接影響。本篇文章將結合IPFoxy代理&…

命題是一種清晰、確定的表達。通過學習命題,來幫助你更清晰地表達自己的思想。

文章目錄 引言 I 命題的特點 可以判斷真偽 同一性 II 有效溝通的小技巧 多用陳述句,少用感嘆句和疑問句。 在表述意思時,多用名詞,少用代詞;多用具體的名詞,少用抽象的名詞,避免造成不必要的歧義。 正確找托詞 引言 要進行有效的邏輯推理,第一步是把我們的想法,我們要…

IPV6地址與IPV4有什么區別?

作為互聯網協議的迭代版本,IPV6(Internet Protocol Version 6)與IPV4(Internet Protocol Version 4)在設計理念和功能特性上存在顯著差異。本文將簡要解析兩者的核心區別,幫助讀者理解IPV6的優勢與必要性。…

python 什么時候應該用函數式編程,什么時候應該用面向對象?

在 Python 這個多范式語言中,選擇使用函數式編程(Functional Programming, FP)還是面向對象編程(OOP)并非一個非黑即白的選擇,而更像是在一個工具箱中為特定的任務挑選最合適的工具。 我們可以用一個比喻來…

【設計模式】迭代器模式 (游標(Cursor)模式)

迭代器模式(Iterator Pattern)詳解一、迭代器模式簡介 迭代器模式(Iterator Pattern) 是一種 行為型設計模式(對象行為型模式),它提供了一種方法來順序訪問一個聚合對象中的各個元素&#xff0c…

docker安裝 Elasticsearch、Kibana、IK 分詞器

Elasticsearch 1.拉去鏡像 docker pull elasticsearch:8.12.2 docker pull kibana:8.12.22.創建掛載目錄 mkdir /root/elasticsearch3.不掛載啟動 docker run -d \ --restartalways \ --name fusion_elasticsearch \ --network fusion_network \ -p 9200:9200 \ -p …

Java面試寶典:Spring專題二

一、介紹下Spring中的事務 1.Spring事務的本質與價值 Spring事務本質是基于AOP的聲明式事務封裝,通過代理機制在目標方法前后注入事務管理邏輯(開啟、提交/回滾)。其核心價值在于: 業務解耦:將事務控制從業務代碼剝離,通過配置或注解管理(如@Transactional)。 統一抽…

DGMR壓縮技術:讓大規模視覺Transformer模型體積減半而性能不減

Transformer架構展現出卓越的擴展特性,其性能隨模型容量增長而持續提升。大規模模型在獲得優異性能的同時,也帶來了顯著的計算和存儲開銷。深入分析主流Transformer架構發現,多層感知器(MLP)模塊占據了模型參數的主要部…

JavaWeb學習打卡14(JSP內置對象及作用域)

JSP 中9 大內置對象PageContext // 用來存東西Request // 用來存東西ResponseSession // 用來存東西Application (ServletContext) // 用來存東西config (ServletConfig)outpage…

濤思數據參與起草中國工業互聯網研究院《工業數據庫規范》全系列標準

最近,《工業數據庫規范》系列團體標準正式發布。該標準由中國工業互聯網研究院牽頭,中國移動通信聯合會發布,共分為三部分—— 第1部分:云數據庫第2部分:實時數據庫第3部分:時序數據庫 濤思數據作為三項標…

使用exceljs導出luckysheet表格 純前端 支持離線使用

一.技術 exceljs,luckysheet 二.實現 參考網上博文exceljs對導出lucksheet表格的實現,發現存在一些問題并給予修復: 1.字體顏色、字號,加粗等適配的問題. 2.單元格對齊方式不生效; 3.單元格邊框無法繪制; 4.單元格邊框顏色及線型錯亂; 5.單元格列…

從0到1學習c++ 命名空間

也是好久沒寫博客了,主播這半年一直在忙別的領域,在磁力驅動領域干了一年,最好發現自己對這個領域并不是很感興趣,做這個領域多半都是為了發文章,現在閑下來了,主播終于也是過上好日子了,主播又…

大模型提示詞漏洞攻防測試:技術分析與實踐指南

引言 隨著ChatGPT、Claude、Gemini等大型語言模型(LLMs)的廣泛應用,它們已經成為現代AI系統的核心組件,被整合到各種產品和服務中。這些模型通過提示。Prompts)與用戶進行交互,而提示詞作為人類與AI溝通的橋梁,其安全性變得尤為重…

Golang實現 - 實現只有表頭的 Excel 模板,并在指定列添加了下拉框功能。生成的 Excel 文件在打開時,指定列的單元格會顯示下拉選項

該版本完全兼容最新版 excelize 庫 (v2.7),實現了只有表頭的 Excel 模板,并在指定列添加了下拉框功能。生成的 Excel 文件在打開時,指定列的單元格會顯示下拉選擇箭頭。代碼如下:package mainimport ("fmt""log&qu…

全連接隊列

監聽套接字使用socket接口創建一個套接字,然后bind給套接字綁定地址,最后listen將套接字設置為監聽套接字。監聽套接字以前理解是三元組標識,后面看了netstat,覺得應該是五元組,只不過它這個五元組是{協議,…

JavaWeb-JSP

JSP JSP就是模板引擎 Template,因為看到的jsp是模板不變的,如果想讓頁面發生改變,就是自己添加java代碼改變頁面。有Java代碼,Tomcat服務器就會對jsp模板進行解析,解析完之后就是Servlet(java類&#xff09…