1. 程式人生 > >linux下對檔案進行批量重新命名

linux下對檔案進行批量重新命名

在使用DIGITS生成LMDB格式的資料時,發現訓練樣本和標籤的命名不一樣,比如對應image000.bmp的標籤為image00_L.png,所以需要刪除所有的“_L”,下面是自己寫的一個指令碼:
for name in /home/philochan/mydata/label/*
do
    filename=$(echo $name | grep 'L')
    if [ "$filename" != "" ]; then
        news=$(echo $filename | sed 's/^.*image//g' | sed 's/_L.*$/.png/g')
        echo image$news
	echo $filename
	mv $filename /home/philochan/mydata/label/image$news
    fi
done

注意:

設定變數時一定不要有空白,比如filename = $(echo $name | grep 'L')是不符合shell語法的

最關鍵的一條語句還是news=$(echo $filename | sed 's/^.*image//g' | sed 's/_L.*$/.png/g'),這裡用到了sed這個管道命令,它可以將資料進行替換、刪除、新增等功能,這裡用到的是部分資料的查詢並替換功能(以行為單位)

sed 's/要被替換的字串/新的字串/g'

.*是一個常用的正則表示式RE,表示任意字元(.表示任意一個字元,*表示重複字元)

grep -n 'g.*g' test.txt 得到含有g...g這個模式的行

^為行首字元,$為行尾字元

grep -n '^[a-z]' test.txt 得到開頭是小寫字元的那行