今天單位系統部署新版本內容,看似一切風平浪靜,兩個小時候快要接近尾聲時卻發生了一件很噁心的事。
由於我的系統在上線新功能後需要由上游系統提供一些初始化文件過來供我的系統進行數據庫的原始功能初始化操作,但上游的管理員一時的大意將傳輸過來的大批量的文件名統統少了一位,這是最讓人抓狂的事。如果數據量小的話還可以手工來逐個目錄進去修改名字。但上萬條的文件名看着就眼暈,無奈之下只能自己寫個腳本給他們善後吧,話不多說上腳本。
示例:目錄結構:
/tmp/file/input/baidu/image/{jpg,gif}/20190823/SINA_SAFEID_CN0110000_ACUP_INIT_20190823_2130.dat(就是示例目錄,不用糾結內容o(╯□╰)o)
vim renameFile.sh
#!/bin/bash
DIRPATH="/tmp/file/input/baidu/image/{jpg,gif}/20190823/*"
for file in $(find $(eval ls $DIRPATH));do
DIR=$(dirname $file)
cd $DIR
OLDNAME=$(basename $file)
NEWNAME=$(echo $OLDNAME |sed 's/CN011000*/CN0110000/g')
if [ "$OLDNAME" == "$NEWNAME" ];then
echo "已經重命名,無需改動!"
else
echo "old ! = new"
mv $OLDNAME $NEWNAME 2>/dev/null
[ $? -eq 0 ] && echo "重命名成功!" || echo "重命名失敗!"
fi
done
吐槽一下:原以爲只是使用一個find 加sed命令即可解決問題,沒想到還是踩了一些坑,也算是自己的基礎知識點不夠吧,在這記錄一下給自己提個醒,正常情況下find命令查找文件或目錄時所給的路徑一般爲字符串,如果需要使用變量的方式來傳遞要查找路徑,直接使用$ARGS方式則會有無法找到路徑的錯誤提示,這是因爲變量中涉及到的大括號無法展開爲真實路徑而導致報錯,此時則需要eval命令來解決這個問題,eval可以將得到的結果進行解析,如果得到的還是一個命令,則會將該命令所獲得的結果作爲最終結果輸出。