文章目錄
- 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命令的執行結果進行檢查,并且輸出相應的成功或失敗信息。
使用現代命令替換語法:
把反引號替換成$(...),提升代碼的可讀性。