如何在linux下批量改名和多子目录下修改文件后缀名的方法和命令总结

学习研究和实际使用中会经常碰到集中、批量文件改名或者添加和删除文件名的问题,所以下定决心研究一下,为了一劳永逸地解决了这个问题,多方学习,下面列出了目前我所能掌握的方法和命令,不正之处请大家指正,欢迎评点、补充,谢谢!

第一种情况: 为文件加后缀

1.问题:

在相同的目录下有海量以日期命名的文件,其中有的有后缀,有的以点结尾,如20020101.,20020102.,……,20020101.td,20020102.td,……
要求: 把所有以点结尾的加上后缀.ts
我自己的方法:
#!/bin/bash
for files in `ls *.`
do
mv $files `echo “$filests” `
done

2. 同上

mv  $files ${files}ts

3. 同上

mv  $files  `$files.ts|sed ‘s/\.//’ `

4. file =>file.txt

mv  $files  $files.txt

5. *.04  => *04.txt

mv $files $(echo ${files}.txt|sed ‘s/\.//1′)

或者

mv $files  `echo ${files}.txt|sed ‘s/\.//1′ `

第二种情况: 为文件改后缀(.old => .new)

有如下方法可供选择:

1. rename .old .new  *

2. mv $files ${file%.old}.new

3. mv $files `echo $files|tr .old .new`

4. mv $files `echo $files|sed ‘s/\.old/\.new/’ `

第三种情况: 给文件去掉后缀 (*.dat => *)

1. mv $files `echo $files |sed ‘s/\.dat//’ `

2. mv $files  `echo $files|tr .dat  (4空格)`

第四种情况:为文件改前缀 (re* => un*)

1. mv $files un${$files#re}

2. mv $files `echo $files | tr re un`

但是在实际使用的时候,碰到一个批量地在好多子目录下修改文件后缀名的问题,例如,现在你有如下的目录结构:

[lan@/home/lan/tmp]$tree

.

|– 11

| `– aa

| `– 11.gif

`– 22

`– bb

`– 22.gif

4 directories, 2 files

[lan@/home/lan/tmp]$

如何才能不用分别进入11/aa目录和22/bb目录下,就可以一次性地将后缀名为gif的文件修改为以jpg为后缀名的文件呢?经过自己的不断尝试和实验,终于找到了完美的命令和方法,只需要在/home/lan/tmp目录下执行如下的命令即可以一次完成这个任务:

rename   .gif   .jpg   */*/*

效果相当爽,不妨你自己试试看