前言
本文主要給大家介紹了關於Linux shell用sed批量更改文件名的相關內容,分享出來供大家參考學習,下面話不多說了,來一起看看詳細的介紹吧。
示例
去除特定字元
目標:將 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進行標准輸出的字元串替換,其通用格式如下:
stdout | sed 's/pattern/replace/'
上述示例中,在末尾添加g用於替換所有匹配項,而不僅僅替換第一個匹配項。
中間插入字元
目標:將 book01.txt、paper02.txt 改為 book-01.txt、paper-02.txt
方法:用分組匹配分別獲取待插入位置兩側的字元串,再通過反向引用實現替換
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 循環中,而不是通過命令來得到,例如:
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
使用 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"`
do
newfile=`echo $file | sed 's/\([a-z]\+\)_\([0-9]\+\)./\2-\1./'`
mv $file $newfile
done
Ⅱ Linux 腳本編寫 如何編寫一個腳本,修改已有文件中的內容
實現的復方法如下:
1、第一步,打制開命令控制台以找到要編輯的文件,執行命令ls來查看下面的一些文件,在下面有一個index.php文件,如下圖所示。
Ⅲ Linux下shell腳本改變文檔格式
#/bin/bash
for a in {1..10};do
echo -n "$a."
echo -n A:
for i in {1..4};do
echo -en "$i"
done
echo
if [ $a -le 9 ];then
echo -n ' B:'
elif [ $a -gt 9 ];then
echo -n ' B:'
fi
for j in {5..8};do
echo -n "$j"
done
echo
done
結果的圖片是從linux拷貝過來的,所以可能顯示不出來效果,建議你復制代碼到linux下試試
[root@localhost ~]# bash ab.sh
1.A:1234
B:5678
2.A:1234
B:5678
3.A:1234
B:5678
4.A:1234
B:5678
5.A:1234
B:5678
6.A:1234
B:5678
7.A:1234
B:5678
8.A:1234
B:5678
9.A:1234
B:5678
10.A:1234
B:5678
我在裡面加了個if語句,如果前面的數字小於等於9的時候,echo B前面加n個空格
如果數字大於9的時候,echoB前面加再多加兩個空格,
條件可以不斷增加。
我也是新手,希望能夠給分。
Ⅳ 如何使用LINUX自動執行腳本實現某目錄下文件改名
#!/bin/bash# this script name is modmv cd $1for filename in *do prefix=`echo $filename | sed -e 's/消消^\([^.]*\.[^.]*\.\).*$/\1/'` suffix=`echo $filename | sed -e 's/^.*\(\.[^.]*\)$/\1/'` mv $filename "$prefix`date "+%Y%m%d%H%M%S"`$suffix"done bash $ modmv /temp # 執行上拿數知面的腳本。 !!!! 本人條件有限。 此腳本未經過測畢裂試。 後果自負。 請自行調試。
Ⅳ 誰知道linux 文件批量復制腳本 把1個復製成不同名字的多個。批量修改文件內容腳本,替換指定的字元。
一個復復制多個
#!制/bin/bash
#a..z代表從字面a到z的26個名字 替換成你要的名字即可 名字之間留空格
#比如 for i in 張三 李四 王五
for i in {a..z}
do
cp -pv 你的文件名 $i
done
修改文件內容
#!/bin/bash
for i in 文件1 文件2 文件3
do
sed -i 's/被替換的字元/替換成的字元/g' $i
done
你的問題能描述的清楚點么。。。
到底是本目錄下一個文件復制多個 還是 多個文件復制多個
Ⅵ linux中想在腳本中實現修改一個ip地址參數的配置文件,用sed命令如何實現
sed -i 's/\(IP=\)\S\S*/\1102.117.2.23/' filename
註:
1)將不變的部分放入帶反斜杠的一對括弧 \( \) 中並在替換時用 \1 引用。
2)\S用於匹配除單個空格符之外的所有字元。
awk -F"=" '{if($1=="IP")print("IP=102.117.2.23")}' filename > filename.new 2>/dev/null
Ⅶ linux下怎麼寫一個自動創建文件夾和文件的腳本
Linux Shell 腳本自動創建文件並修改其許可權
在學習《Linux就該這么學》時,每次運行書上的代碼時,需要創建一個testxx.sh文件,修改其執行許可權,最後再用vim來編輯。這樣一個重復的過程,可以通過書中學習的知識編寫一個腳本來自動解決,該腳本命名為NewTestSh。
代碼如下:
fileName=test"$1".sh
echo "Create new test file: $fileName"
touch $fileName
chmod u+x $fileName
read -p "Press Enter to start to edit the file: " start
vim $fileName
完成後,將文件NewTestSh復制到目錄/usr/bin下,並用命令
sudo chmod 777 /usr/bin/NewTestSh1
來修改其執行許可權。如此之後,隨時隨地可以用腳本NewTestSh來自動創建新的名為testxx.sh的可執行文件。
用法示例:
NewTestSh 151
在當前目錄下創建一個名為test15.sh的可執行文件,再次按Enter後文件將被編輯器vim打開。
達到小小的學以致用的目的了。
深入學習bash shell腳本看下《linux就該這么學》