微子網絡與大家分享了在Linux shell中使用sed批量更改文件名的方法。希望你看完這篇文章有所收獲。大家一起討論一下。
示例
去除特定字符
目標:把2017-01-01.jpg和2018-01-01.jpg變成20170101.jpg和20180101.jpg
方法:用空值替換全部
for filein ` ls | grep . jpg ` s
做
newfile=`echo$file|sed的/-//g ' `
mv$file$newfile
在此完成,sed用于替換標準輸出的字符串,其一般格式如下:
Stdout|sed的/pattern/replace/'在上面的示例中,在末尾添加了G以替換所有匹配項,而不僅僅是第一個匹配項。
中間插入字符
目標:把book-01.txt和紙-02.txt改成book-01 . txt和紙-02.txt。
方法:利用組匹配獲取待插入位置兩側的字符串,然后用反向引用替換
for filein ` ls | grep . txt ` s
做
newfile=`echo$file|sed的/\([a-z]\ \)\([0-9]\ \)/\1-\2/' '
mv$file$newfile
完成分析
在上面的例子中,要重命名的文件列表是通過ls和grep命令獲得的,然后用sed命令替換字符串,最后用mv命令更改文件名。
有很多方法可以得到要重命名的文件列表,比如find命令或者直接字符串,后面會提到。
注意ls | grep。for循環后的txt。該命令包含在兩個反單引號中,其功能與$(ls | grep)相同。txt)。封閉的字符串將作為命令執行,然后返回字符串結果。
文件名包含空格的解決方法
我們可以將文件列表直接寫入for循環,而不是通過命令獲取,例如:
對于文件“文件1文件2文件3”
做
.
Done可以看到for循環按空格拆分字符串,所以如果要更改的文件名包含空格,就會被拆分成多個文件名,導致錯誤。
為了解決這個問題,我們可以將IFS(內部字段分隔符)設置為一個新的行字符\n,這樣for循環就會逐行獲取變量的值,保證每次都得到一個完整的文件名。
設置IFS變量的命令需要放在for循環之前:
IFS=$'\n '
forfilein`ls
做
.
完成也可以直接使用while read命令一次讀取一行到變量文件中:
ls|grep'*。txt“| while readfile”
做
.
完成使用 find 獲取文件列表
在前面的例子中,我們使用ls命令來獲取文件列表。這個命令只能獲取某個目錄的文件,不能按多個條件過濾。
說到文件搜索,不得不提功能強大的find命令。該命令可以在多級目錄中查找文件,并可以設置創建時間、文件大小、所有者等各種條件。查找文件特別方便靈活。
使用find命令獲取文件列表,然后使用sed命令用正則表達式修改文件名。這兩個命令的組合可以完成幾乎所有常見的批量重命名任務。
例如,所有大于1M且后綴為txt或jpg的文件都從book_20170101.txt和image_20170101.jpg格式的文件重命名為20170101-book.txt和20170101-image.jpg,代碼如下:
forfilein`find。-大小1M-名稱' *_*。txt'-o-name'*_*。jpg ' ` s
做
newfile=`echo$file|sed的/\([a-z]\ \)_\([0-9]\ \)。/\2-\1./'`
mv$file$newfile
讀完這篇文章,done相信你已經對Linux shell中使用sed批量更改文件名的方法有了一定的了解。如果您想了解更多相關知識,請關注微子網絡,感謝您的閱讀!