shell 整理(27)===大小寫字母替換修改文件名
(一)題目:
(1)創建一個文件夾
(2)文件夾裏面有10 個以任意字母或數字開頭的文件
(3)如果開頭第一位數字就不做改變
(4)如果開頭第一位字母就改成大寫
例如:修改後的結果
[[email protected] hushuai]# ls
06e28fe4 5b1775ab 74d1badf Cccb27b2 F3619201
3bfaa07c 6bd6b971 C4a1f7d8 Db3308c4 F6403885
[[email protected] hushuai]#
shell 代碼如下:
#!/bin/bash
a=`ls hushuai/ |xargs -n1`
echo "$a" |while read line #這個地方必須加雙引號,細節,不加不解析空格
do
b=`echo $line | cut -c1`
c=`echo $line |cut -c2-`
d=`echo $b |grep -c ‘[a-z]‘` #必須加[],和tr 不一樣
if [ $d -eq 1 ];then
e=`echo $b | tr ‘a-z‘ ‘A-Z‘`
mv hushuai/$b$c hushuai/$e$c 2>/dev/null
fi # mv 舊名字 新名字
done
這樣寫顯得沒有條理,紛繁復雜,我們可以把判斷改成函數,修改結果如下:
#!/bin/bash
swap(){ b=`echo $line | cut -c1`
c=`echo $line |cut -c2-`
d=`echo $b |grep -c ‘[a-z]‘`
}
a=`ls hushuai/ |xargs -n1`
echo "$a" |while read line
do
swap
if [ $d -eq 1 ];then
e=`echo $b | tr ‘a-z‘ ‘A-Z‘`
mv hushuai/$b$c hushuai/$e$c 2>/dev/null
fi #如果說你執行多次腳本,名字第一次已經改過來了
done 就會報錯,我們讓錯誤輸出到空
然後我們給這個題目做一下升級
(1)創建一個文件夾
(2)文件夾裏面有10以dingxue為開頭的任意6-10位隨機數組成
(3)把dingxue 的首字母ding 換成任意一個大寫字母
(4)把後面的6-10位隨機數換成等長度的小寫字母
例如:
[[email protected] hushuai]# ls ding/
dingxue87495987 dingxue885527619 dingxue894674790 dingxue908168
dingxue87819699 dingxue8884654 dingxue8974959
dingxue8810688 dingxue89173327 dingxue903851012
shell 代碼如下:
#!/bin/bash
#for i in `seq 10`
#do
# b=$((RANDOM%4+6)) #隨機數的應用
# a=`date +%N`
# c=`echo $a | cut -c1-$b`
# touch dingxue$c
#done
a=`ls ding/ |xargs -n1`
echo {A..Z} |xargs -n1>file
d=`cat file | wc -l`
echo "$a" |while read line
do
e=$((RANDOM%$d+1))
w=`echo $line |awk -F ‘[0-9]‘ ‘{print $1}‘`
b=`echo $line | cut -c 1`
f=`cat file | sed -n ‘‘$e‘p‘`
g=`echo $w |sed ‘s/‘$b‘/‘$f‘/‘` #sed 、awk 引用變量都加個單引號
#echo $g 具體情況具體定
h=`echo $line| awk -F‘[a-z]‘ ‘{print $8}‘`
i=`echo $h |tr ‘‘$h‘‘ ‘a-z‘` #這裏也是,一定要註意我的引號
echo $g$i
done
這是我剛開始寫的,是不是看上去很亂呢,我們可以把判斷部分改成函數,修改結果如下:
shell 代碼:
#!/bin/bash
prepare() {
a=`ls ding/ |xargs -n1`
echo {A..Z} |xargs -n1>file
d=`cat file | wc -l`
}
random () {
e=$((RANDOM%$d+1))
}
virable () {
w=`echo $line |awk -F ‘[0-9]‘ ‘{print $1}‘`
b=`echo $line | cut -c 1`
f=`cat file | sed -n ‘‘$e‘p‘`
g=`echo $w |sed ‘s/‘$b‘/‘$f‘/‘`
h=`echo $line| awk -F‘[a-z]‘ ‘{print $8}‘`
i=`echo $h |tr ‘‘$h‘‘ ‘a-z‘`
}
prepare
echo "$a" |while read line
do
random
virable
echo $g$i
done
這樣是不是清晰了很多了呢?
本文出自 “IT生活” 博客,謝絕轉載!
shell 整理(27)===大小寫字母替換修改文件名