Linux Shell 利用sed批量更改文件名

更改文件後綴

將所有的.html文件更改爲. jpg文件

[root@show day74]# for name in `ls *.html`;do echo $name ${name%.html}.jpg;done
00.html 00.jpg
01.html 01.jpg
02.html 02.jpg
03.html 03.jpg
04.html 04.jpg
05.html 05.jpg
06.html 06.jpg
07.html 07.jpg
08.html 08.jpg
09.html 09.jpg
10.html 10.jpg
[root@show day74]# for name in `ls *.html`;do mv $name ${name%.html}.jpg;done
[root@show day74]# ls 
00.jpg 01.jpg 02.jpg 03.jpg 04.jpg 05.jpg 06.jpg 07.jpg 08.jpg 09.jpg 10.jpg

去除特定的字符

目標:將 2017-01-01.jpg、2018-01-01.jpg 改爲 20170101.jpg、20180101.jpg

方法:將所有 - 替換爲空

for file in `ls | grep .jpg`
do
 newfile=`echo $file | sed 's/-//g'`
 mv $file $newfile
done

中間插入字符

目標:將 book01.txt、paper02.txt 改爲 book-01.txt、paper-02.txt

方法:用分組匹配分別獲取待插入位置兩側的字符串,再通過反向引用實現替換

for file in `ls | grep .txt`
do
 newfile=`echo $file | sed 's/\([a-z]\+\)\([0-9]\+\)/\1-\2/'`
 mv $file $newfile
done

上述示例首先通過 ls 和 grep 命令得到待改名的文件列表,然後用 sed 命令進行字符串的替換,最後再使用 mv 命令來完成文件名的更改。

獲取待改名文件列表的方法有很多,可以通過 find 命令,也可以直接給出字符串,我們將在下文中提到。

注意: for 循環後面的 ls | grep .txt,這條命令用兩個反單引號括了起來,與 $(ls | grep .txt) 的作用相同,被包圍的字符串會被當作命令執行,然後返回字符串結果。

文件名包含空格的解決方法

我們可以直接將文件列表寫到 for 循環中,而不是通過命令來得到,例如:

for file in "file1 file2 file3"
do
 ...
done

for循環是通過空格來分割字符,因此如果待更改的文件名中包含空格的話,就會被拆分成多個文件名,從而出錯。
要解決這個問題,我們可以將IFS(內部字段分隔符)設置爲換行符\n,這樣for循環就會按行來獲取變量的值,確保每次獲取的確實是一個完整的文件名。
設置IFS變量的命令需要放在for循環之前:

IFS=$'\n'
for file in `ls`
do
 ...
done

也可以直接使用 while read 命令一次讀取一行到變量 file 中

ls | grep "*.txt" | while read file
do
 ...
done

使用 find 獲取文件列表

之前的示例中,我們是通過 ls 命令來獲取文件列表。該命令只能獲取某個目錄的文件,而且沒法進行多種條件的篩選。

而一說到文件的查找,不得不提到功能強大的 find 命令。該命令可以在多個層次的目錄中查找文件,並能夠設定諸如創建時間、文件大小、所有者等多種條件,查找起文件來特別方便靈活。

用 find 命令來獲取文件列表,再用 sed 命令配合正則表達式來修改文件名,這兩個命令的結合幾乎能完成所有常見的批量改名任務。

例如,將所有大於1M,且後綴爲txt或jpg的文件,由形如 book_20170101.txt、image_20170101.jpg 的文件改名爲 20170101-book.txt、20170101-image.jpg,代碼如下:

for file in `find . -size +1M -name "*_*.txt" -o -name "*_*.jpg"`
do
 newfile=`echo $file | sed 's/\([a-z]\+\)_\([0-9]\+\)./\2-\1./'`
 mv $file $newfile
done

參考文獻:https://blog.csdn.net/u013991521/article/details/80531019

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章