Linux shell利用sed如何批量更改文件名詳解
前言
本文主要給大家介紹了關(guān)于Linux shell用sed批量更改文件名的相關(guān)內(nèi)容,分享出來供大家參考學(xué)習(xí),下面話不多說了,來一起看看詳細(xì)的介紹吧。
示例
去除特定字符
目標(biāo):將 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
這里使用sed進(jìn)行標(biāo)準(zhǔn)輸出的字符串替換,其通用格式如下:
stdout | sed 's/pattern/replace/'
上述示例中,在末尾添加g用于替換所有匹配項,而不僅僅替換第一個匹配項。
中間插入字符
目標(biāo):將 book01.txt、paper02.txt 改為 book-01.txt、paper-02.txt
方法:用分組匹配分別獲取待插入位置兩側(cè)的字符串,再通過反向引用實現(xiàn)替換
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 命令進(jìn)行字符串的替換,最后再使用 mv 命令來完成文件名的更改。
獲取待改名文件列表的方法有很多,可以通過 find 命令,也可以直接給出字符串,我們將在下文中提到。
注意 for 循環(huán)后面的 ls | grep .txt
,這條命令用兩個反單引號括了起來,與 $(ls | grep .txt)
的作用相同,被包圍的字符串會被當(dāng)作命令執(zhí)行,然后返回字符串結(jié)果。
文件名包含空格的解決方法
我們可以直接將文件列表寫到 for 循環(huán)中,而不是通過命令來得到,例如:
for file in "file1 file2 file3" do ... done
可以看到 for 循環(huán)是通過空格來分割字符串,因此如果待更改的文件名中包含空格的話,就會被拆分成多個文件名,從而出錯。
要解決這個問題,我們可以將 IFS(內(nèi)部字段分隔符)設(shè)置為換行符 \n,這樣一來,for 循環(huán)就會按行來獲取變量的值,確保每次獲取的確實是一個完整的文件名。
設(shè)置 IFS 變量的命令需要放在 for 循環(huán)之前:
IFS=$'\n' for file in `ls` do ... done
也可以直接使用 while read 命令一次讀取一行到變量 file 中:
ls | grep "*.txt" | while read file do ... done
使用 find 獲取文件列表
之前的示例中,我們是通過 ls 命令來獲取文件列表。該命令只能獲取某個目錄的文件,而且沒法進(jìn)行多種條件的篩選。
而一說到文件的查找,不得不提到功能強(qiáng)大的 find 命令。該命令可以在多個層次的目錄中查找文件,并能夠設(shè)定諸如創(chuàng)建時間、文件大小、所有者等多種條件,查找起文件來特別方便靈活。
用 find 命令來獲取文件列表,再用 sed 命令配合正則表達(dá)式來修改文件名,這兩個命令的結(jié)合幾乎能完成所有常見的批量改名任務(wù)。
例如,將所有大于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
有關(guān) find 命令的更多用法,可以參考 http://www.dbjr.com.cn/article/108198.htm
總結(jié)
以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對大家的學(xué)習(xí)或者工作能帶來一定的幫助,如果有疑問大家可以留言交流,謝謝大家對腳本之家的支持。
相關(guān)文章
Keepass+PuTTYPortable+Winscp一鍵登錄實例詳解
這篇文章主要介紹了Keepass+PuTTYPortable+Winscp一鍵登錄實例詳解的相關(guān)資料,需要的朋友可以參考下2017-01-01Linux服務(wù)器磁盤空間占用情況分析與清理指南(解決方法)
為防止節(jié)假日期間服務(wù)器磁盤占用過高引起報警,需在節(jié)前檢查并清理磁盤,檢查條件包括使用率超90%、剩余空間不足30G等,通過shell腳本自動判斷并輸出異常信息,腳本及使用方法詳細(xì)介紹,感興趣的朋友一起看看吧2024-09-09Ubuntu 18.04中截圖工具shutter的編輯按鈕不可用的解決辦法
Shutter是一個由第三方提供的在Ubuntu上運(yùn)行的截圖工具。這篇文章主要介紹了Ubuntu 18.04中截圖工具shutter的編輯按鈕不可用的解決辦法及Ubuntu18.04 截圖工具推薦,需要的朋友可以參考下2018-08-08在linux中用同一個版本的R 同時安裝 Seurat2 和 Seurat3的教程
這篇文章主要介紹了在linux中用同一個版本的R 同時安裝 Seurat2 和 Seurat3的教程,本文給大家介紹的非常詳細(xì),具有一定的參考借鑒價值,需要的朋友可以參考下2019-08-08centos 7.5 部署varnish緩存服務(wù)器功能
這篇文章主要介紹了centos 7.5 部署varnish緩存服務(wù)器功能,文中給大家介紹了varnish的簡介和主要特征,需要的朋友可以參考下2019-10-10redhat Server release 5.2 安裝配置簡明教程
系統(tǒng)安裝:系統(tǒng)安裝采用光盤安裝,以前一直從USB移動硬盤安裝,前幾天心血來潮,刻成了DVD,以示嚴(yán)肅和一切從頭開始,呵呵。2009-08-08