shell批量改名

2021-08-14 12:25:44 字數 4763 閱讀 9679

前言

示例

去除特定字元

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

方法:將所有 - 替換為空?

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

1

stdout |sed's/pattern/replace/'

上述示例中,在末尾新增g用於替換所有匹配項,而不僅僅替換第乙個匹配項。

中間插入字元

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

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

1

2

3

4

5

forfilein`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

forfilein"file1 file2 file3"

do

...

done

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

要解決這個問題,我們可以將 ifs(內部字段分隔符)設定為換行符 \n,這樣一來,for 迴圈就會按行來獲取變數的值,確保每次獲取的確實是乙個完整的檔名。

設定 ifs 變數的命令需要放在 for 迴圈之前:?

1

2

3

4

5

ifs=$'\n'

forfilein`ls`

do

...

done

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

1

2

3

4

ls|grep"*.txt"|whilereadfile

do

...

done

使用 find 獲取檔案列表

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

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

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

例如,將所有大於1m,且字尾為txt或jpg的檔案,由形如 book_20170101.txt、image_20170101.jpg 的檔案改名為 20170101-book.txt、20170101-image.jpg,**如下:?

有關 find 命令的更多用法,可以參考

總結

目錄下檔名為如下,要求去掉_finished。

可以實現的方法有很多種:

方法一:for迴圈結合sed替換

[baby@localhost ~]$ for file in `ls *.jpg`;do mv $file `echo $file|sed 's/_finished//g'`;done;
方法二:ls結合awk,輸出交給bash執行

[baby@localhost ~]$ ls *.jpg |awk -f "_finished" ''|bash
方法三:rename改名

[baby@localhost ~]$ rename "_finished" "" *.jpg
方法四:for迴圈加變數部分擷取

[baby@localhost ~]$ for file in `ls *.jpg`;do mv $file `echo $.jpg`;done;
不使用echo也可以實現

[baby@localhost ~]$ for file in `ls *.jpg`;do mv $file $.jpg;done;
原文:

批量改名高招

很多人平時修改副檔名都是用acdsee或total commander,不過,今天我卻要向大家介紹一款批量重新命名的好軟體?better file rename 以下簡稱為bfr 它是 資源管理器 的擴充套件外殼,並支援多種引數,幫助我們快速簡便修改檔名和檔案修改時間,它可以分別處理檔名和副檔名。最...

批量改名總結

承蒙cu各位大俠關照,現將自己蒐集整理的檔案批量改名方法總結如下,有原創也有引用,引用恕不一一註明。學習研究中經常碰到批量檔案改名問題,所以下決心一勞永逸地解決了這個問題,不正之處請方家指正,歡迎評點 補充,謝謝!a 加字尾 1.問題 同以目錄下有海量以日期命名的檔案,其中有的有字尾,有的以點結尾,...

python 批量改名指令碼

第66屆艾美獎上,絕命毒師 一舉拿下了劇情類最佳劇集 最佳男主 最佳男女配角和最佳劇本5項重要大獎,成為艾美獎最大的贏家。這部歷時六年,共62集的劇集憑藉metacritic metacritic的評分是收錄各 的評分,並綜合得出的評分 99分 滿分100 的成績,成為寫入健力士世界紀錄大全的 世界...