日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > linux >内容正文

linux

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

發布時間:2023/12/20 linux 43 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Linux shell利用sed如何批量更改文件名详解 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

轉載自:http://www.jb51.net/article/124047.htm

示例1:去除特定的字符

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

方法:將所有 - 替換為空

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

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

stdout | sed 's/pattern/replace/'

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

示例2:中間插入字符

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

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

for file in `ls | grep .txt` donewfile=`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) 的作用相同,被包圍的字符串會被當作命令執行,然后返回字符串結果。

示例3:文件名包含空格的解決方法

我們可以直接將文件列表寫到 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

示例4:使用 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"` donewfile=`echo $file | sed 's/\([a-z]\+\)_\([0-9]\+\)./\2-\1./'`mv $file $newfile done

實踐:將下面的.flv的文件的文件名全部去掉前邊的0001.嗶哩嗶哩-Java 版數據結構與算法-

原始文件:

修改后的文件:

解決方法:

IFS=$'\n' for file in `ls|grep .flv` donewfile=`echo $file | sed 's/0001.嗶哩嗶哩-Java 版數據結構與算法-//g'`echo $newfilemv $file $newfile done

總結

以上是生活随笔為你收集整理的Linux shell利用sed如何批量更改文件名详解的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。