一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務器之家:專注于服務器技術及軟件下載分享
分類導航

Linux|Centos|Ubuntu|系統進程|Fedora|注冊表|Bios|Solaris|Windows7|Windows10|Windows11|windows server|

服務器之家 - 服務器系統 - Linux - Linux shell利用sed如何批量更改文件名詳解

Linux shell利用sed如何批量更改文件名詳解

2022-02-17 19:46Wray Zheng Linux

最近在學習shell,為了練習sed,寫了個簡單的批量修改文件名的腳本,所以下面這篇文章主要給大家介紹了關于Linux shell利用sed如何批量更改文件名的相關資料,需要的朋友們可以參考借鑒,下面來一起看看吧。

前言

本文主要給大家介紹了關于Linux shell用sed批量更改文件名的相關內容,分享出來供大家參考學習,下面話不多說了,來一起看看詳細的介紹吧。

示例

去除特定字符

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

方法:將所有 - 替換為空

?
1
2
3
4
5
for file in `ls | grep .jpg`
do
 newfile=`echo $file | sed 's/-//g'`
 mv $file $newfile
done

這里使用sed進行標準輸出的字符串替換,其通用格式如下:

?
1
stdout | sed 's/pattern/replace/'

上述示例中,在末尾添加g用于替換所有匹配項,而不僅僅替換第一個匹配項。

中間插入字符

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

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

?
1
2
3
4
5
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 循環中,而不是通過命令來得到,例如:

?
1
2
3
4
for file in "file1 file2 file3"
do
 ...
done

可以看到 for 循環是通過空格來分割字符串,因此如果待更改的文件名中包含空格的話,就會被拆分成多個文件名,從而出錯。

要解決這個問題,我們可以將 IFS(內部字段分隔符)設置為換行符 \n,這樣一來,for 循環就會按行來獲取變量的值,確保每次獲取的確實是一個完整的文件名。

設置 IFS 變量的命令需要放在 for 循環之前:

?
1
2
3
4
5
IFS=$'\n'
for file in `ls`
do
 ...
done

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

?
1
2
3
4
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,代碼如下:

?
1
2
3
4
5
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

有關 find 命令的更多用法,可以參考 http://m.ythuaji.com.cn/article/217260.html

總結

以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作能帶來一定的幫助,如果有疑問大家可以留言交流,謝謝大家對服務器之家的支持。

原文鏈接:http://www.codebelief.com/article/2017/09/linux-shell-rename-multiple-files-using-sed/

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 激情综合站 | 国产第一页在线视频 | 亚洲精美视频 | 国产精品热久久毛片 | 亚洲欧美在线免费 | 亚洲色图2 | 四虎影视永久在线 | 成人免费观看在线视频 | 九九精品国产亚洲A片无码 九九99热久久999精品 | 亚洲欧美日韩国产精品影院 | 免费岛国片 | 日本激情在线 | 久久精品亚洲国产AV涩情 | 狠狠色综合久久婷婷色天使 | 久久这里只精品热在线18 | 成人综合婷婷国产精品久久免费 | 欧美男男gaygaysxxx | 欧美草逼网站 | 暖暖 免费 高清 日本 在线 | 好看华人华人经典play | 骚虎网站在线观看 | 国产欧美日韩综合二区三区 | 日日网| 日本在线观看免费观看完整版 | 日本不卡一区二区三区在线观看 | 国产日本韩国不卡在线视频 | 国产视频福利 | 久久囯产精品777蜜桃传媒 | 午夜精品久久久久久中宇 | 欧美色综合高清免费 | 亚洲国产精品ⅴa在线观看 亚洲国产高清一区二区三区 | 亚洲天堂网在线观看视频 | 亚洲天堂精品在线观看 | 亚洲国产精品一区二区三区久久 | 色色色色色色网 | 欧美日韩亚洲一区二区三区在线观看 | 99久久精品6在线播放 | 欧美亚洲国产精品久久第一页 | 国产一区二区三区欧美精品 | 日本美女动态图片 | jzz大全部 |