CentOS 批量修改文件名

find -name "*.txt" |for i in *;do mv  $i `echo $i |sed 's/\.txt//g'`;done

find -name "*.txt" |awk -F'.' '{print $1} |xargs mv {}.txt {}

如果只是修改后缀名,用rename 即可,命令如下:

rename  .txt  .bk *

 

Linux下批量修改文件名

1. rename命令批量修改文件名

Linux下可以使用别的办法来批量修改文件名, 不过rename实在太方便了

比如把所有的表为cdb1_* 修改为cdb_*的,在本目录下只需要

# rename 'cdb1' 'cdb' *

以前都是写个for循环来做...想想多傻啊, 呵呵

rename还有更多的功能, 建议man rename下

RENAME(1)                                      Perl Programmers Reference Guide                                     RENAME(1)

NAME
       rename - renames multiple files

SYNOPSIS
       rename [ -v ] [ -n ] [ -f ] perlexpr [ files ]

DESCRIPTION
       "rename" renames the filenames supplied according to the rule specified as the first argument.  The perlexpr argument
       is a Perl expression which is expected to modify the $_ string in Perl for at least some of the filenames specified.
       If a given filename is not modified by the expression, it will not be renamed.  If no filenames are given on the
       command line, filenames will be read via standard input.

       For example, to rename all files matching "*.bak" to strip the extension, you might say

               rename 's/\.bak$//' *.bak

       To translate uppercase names to lower, you'd use

               rename 'y/A-Z/a-z/' *

OPTIONS
       -v, --verbose
               Verbose: print names of files successfully renamed.

       -n, --no-act
               No Action: show what files would have been renamed.

       -f, --force
               Force: overwrite existing files.

ENVIRONMENT
       No environment variables are used.

 

 

2. 批量更改文件名 rename

通过 man rename 命令可以得知,rename 命令其实是一个 Perl 脚本命令,
它专用于批量地给多文件重命名(rename multiple files)

命令格式 : 

rename [ -v ] [ -n ] [ -f ] perlexpr [ files ] 

perlexpr 是一种 Perl 脚本格式的正则表达式。

参数:
-v, --verbose 
Verbose: print names of files successfully renamed.
详细模式:打印成功更改的文件名列表
-n, --no-act 
No Action: show what files would have been renamed.
测试模式:并不真正的执行命令,而只是显示哪些文件名应该怎么进行
更改,用于测试模式。
-f, --force 
Force: overwrite existing files.
强制模式:在更改文件名,如果更改后的文件已经存在时覆盖已经存在
的文件。

rename 的典型应用: 

0. 批量更改文件扩展名 
$ ls 
1.txt 2.txt 3.txt 4.txt 
$ rename 's//.txt//.ext/' * 
$ ls 
1.ext 2.ext 3.ext 4.ext 
 

1. 批量删除文件扩展名 
$ ls 
1.txt 2.txt 3.txt 4.txt 
$ rename 's//.txt//' * 
$ ls 
1 2 3 4 
 

2. 批量添加文件扩展名 
   $ ls 
1 2 3 4 
$ rename 's/$//.txt/' * 
$ ls 
1.txt 2.txt 3.txt 4.txt 
 

3. 按自己的方式批量重命名文件 
$ ls 
1.ext 2.ext 3.ext 4.ext 
$ rename 's/(/d)/第$1 章/' * 
$ ls 
第 1 章.ext 第 2 章.ext 第 3 章.ext 第 4 章.ext 
 

方法1:把文件名拆分处理,可以任意修改文件名

find -name '*.log' -printf %f//n|awk -F'.' '{print $1}'|xargs -i{} mv {}.log mim_{}.log

方法2:利用rename

一般的linux下的rename命令比较简单

rename 'test' 'mim' '*.log'

把文件名中的某部分字符串替换掉

ubuntu下的rename命令支持正则表达式,因此功能更强大。

方法3:直接利用find和xargs和mv,中间不用awk,这样只能添加后缀名,不能修改文件名。

 

rename 实例 (Ubuntu)

homer@mimvp# ls * 										# 显示所有文件
111.txt  222.txt  333.txt
homer@mimvp# ls * | xargs rename 's//aaa_/'				# 修改所有文件,添加前缀 aaa_
homer@mimvp# ls * 										# 显示添加前缀的所有文件
aaa_111.txt  aaa_222.txt  aaa_333.txt
homer@mimvp# ls * | xargs rename 's/\.txt/_bk\.txt/'	# 修改所有文件,添加后缀 _bk
homer@mimvp# ls *  										# 显示添加前缀的所有文件
aaa_111_bk.txt  aaa_222_bk.txt  aaa_333_bk.txt

homer@mimvp# ls * | xargs rename 's/_bk\.txt/\.txt/'	# 修改所有文件,删除后缀 _bk
homer@mimvp# ls *  										# 显示删除后缀的所有文件
aaa_111.txt  aaa_222.txt  aaa_333.txt
homer@mimvp# ls * | xargs rename 's/aaa_//'				# 修改所有文件,删除前缀 aaa_
homer@mimvp# ls * 										# 显示删除前缀的所有文件
111.txt  222.txt  333.txt

 

rename 实例 (CentOS)

ls 2016121*.txt | xargs  rename  .txt _bk.txt

homer@mimvp# ls 2016121*.txt 
20161210.txt
20161211.txt
20161212.txt
20161213.txt
20161214.txt
20161215.txt
20161216.txt
20161217.txt
20161218.txt
20161219.txt
homer@mimvp# ls 2016121*.txt | xargs  rename  .txt  _bk.txt
homer@mimvp# ls 2016121*.txt 
20161210_bk.txt
20161211_bk.txt
20161212_bk.txt
20161213_bk.txt
20161214_bk.txt
20161215_bk.txt
20161216_bk.txt
20161217_bk.txt
20161218_bk.txt
20161219_bk.txt

 

 

参考推荐

Linux下批量修改文件名(rename)

Linux rename命令批量重命名的方法

Linux 之 shell 算术运算符

Linux 之 shell 比较运算符