linux批量修改文件名多目录,Linux下批量修改文件名
2, Perl 版本的批量重命名,帶有Perl的好處是,你可以使用正則表達式來完成很奇特的功能。
perl 版本的參數(shù)格式:
rename? perlexpr files
注意,perl版本的rename只有兩個參數(shù),第一個參數(shù)為perl正則表達式,第二個參數(shù)為所要處理的文件
man rename的幫助示例:
1) 有一批文件,以 .bak結(jié)尾,現(xiàn)在想把這些 .bak 統(tǒng)統(tǒng)去掉。
rename???? 's/\.bak$//'??????? *.bak
這個命令很簡單,因為我還沒有系統(tǒng)學(xué)習(xí)過perl,我不知道perl里替換字符串是不是這么干的,但sed是這么干的,所以如果你有sed或者tr基礎(chǔ),很容易明白,這個替換和sed里的正則語法是一模一樣的。
2) 把所有文件名內(nèi)含有大小字母的,修改為小寫字母。
rename????? 'y/A-Z/a-z/'??????? *
依然和sed的替換語法一樣,不用多解釋,如果看不懂的話,可以系統(tǒng)學(xué)習(xí)一下sed先。
還有幾個比較實用的例子:
1) 批量去掉文件名里的空格
Linux文件名本來是不支持空格的,不知道什么時候允許了,當(dāng)然,在命令行調(diào)用文件的時候,空格是很有問
題滴,比如你 原來可以直接? mv? oldfile? newfile? 但有空格就不行了 , 得加雙引號: mv "oldfile"
"newfile" 或者用反斜杠轉(zhuǎn)移? \[] ,這樣還好,但如果你直接把含有空格的圖片名引入
Latex文檔,Latex生成pdf的時候會直接打印出文件名,之前這個問題苦惱了我很久,我生成的pdf怎么老是出現(xiàn)文件名呢?后來才發(fā)現(xiàn)原來是文件
名內(nèi)含有空格的問題!windows系統(tǒng)下生成的文件名是天生含有空格的,雖然很討厭,但有些惠普掃描儀生成的圖片默認就加入了空格,沒有辦法,只好去掉
他,在系統(tǒng)研究rename命令前,我是用 mv 去除空格的。
網(wǎng)上流程的兩個去空格的版本:
1) tr 版:
find . -type f -name "* *" -print |
while read name; do
na=$(echo $name | tr ' ' '_')
if [[ $name != $na ]]; then
mv "$name" $na
fi
done
這個版本以前我一直用的,不知道哪個網(wǎng)上搜刮來的,當(dāng)時還沒有系統(tǒng)的學(xué)習(xí)過 tr/sed/awk命令。
注解一下,很好理解, find .
type f -name "* *" -print 這一句是查找當(dāng)前目錄下所有類型為普通文件的 并且名字之中含有空格的文件,并打印出來,其實
find默認就是打印的 這個 -print 多余了,然后 通過管道傳輸給 while 循環(huán)讀取,文件名放到 name 變量里,用 tr 命令
替換空格為 下劃線。 下面判斷如果執(zhí)行后的名稱不相同,使用 mv
命令重命名。但這個if判斷可有可無,因為find已經(jīng)查詢了所有文件名中含有空格的,那么經(jīng)過 tr 命令后, $na變量肯定不等于 $name
變量的。
所以這段代碼可以簡化:
find . -type f -name "* *" |
while read name; do
na=$(echo $name | tr ' ' '_')
mv "$name" "$na"
done
tr 可以看著是 sed 的一個精簡版本,tr 用下劃線來替換空格。
還有一個 是 sed 版本實現(xiàn):
for f in *;do mv "$f" `echo "$f" | sed 's/[ ]\+/_/g' `; done
這里的 sed表達式還可以這樣寫:
sed 's/[[:space:]]\+/_/g'
不過記住,sed里的出現(xiàn)一次或多次的加號是需要添加反斜杠的。即:\+
這樣就可以了。
好了,這兩種辦法都太他媽羅嗦了,看看rename實現(xiàn)吧:
rename????? 's/[ ]+/_/g'??????? *
OK就這么簡單。
方括號內(nèi)的空格可以用 [:space:]代替,
即可以寫成 's/[[:space:]]+/_/g'
這里注意,rename 采用的是標準perl正則語法,所以無須將 加號轉(zhuǎn)變?yōu)榉葱备芗犹?/p>
即 + 不能修改為 \+,否則替換失敗。
還有幾個好玩的例子:
比如統(tǒng)一在文件頭部添加上 hello
rename????????? 's/^/hello/'??????? *
統(tǒng)一把.html擴展名修改為 .htm
rename????????? 's/.html$/.htm/'????? *
統(tǒng)一在尾部追加 .zip后綴:
rename????????? 's/$/.zip/'????? *
統(tǒng)一去掉.zip后綴:
rename????????? 's/.zip$//'????? *
Ok ,rename就研究了這么多,暫時不知道如何在rename中引入動態(tài)變量,比如 $i++
我測試過 i=0;? rename -n "s/^.*$/$((++i))/"?? *? 執(zhí)行后i被自增了1,并非想我想像中那樣,可以在每操作一個文件自增一,猜想可能是因為rename批量實現(xiàn)的,導(dǎo)致++i只計算一次!
-n 用來測試rename過程,并不直接運行,可以查看測試效果后,然后再運行。
總結(jié)
以上是生活随笔為你收集整理的linux批量修改文件名多目录,Linux下批量修改文件名的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: vue的mounted和created方
- 下一篇: 往事如烟 - 老钟1