五种方法实现Linux批量重命名文件
Linux批量重命名文件是指对某些特定的文件统一进行重新命名,以改变原来一批文件的名称,这里介绍五种方法来实现。
Linux批量重命名文件会涉及到改变一个字母、改变一些相连字母、改变某些位置的字母、在最前面加上某些字母、或者改变字母的大小写。完成这里五个方法基本上就会解决了Linux批量重命名的工作。
1、我想把它们的名字的第一个1个字母变为"q",其它的不变
[root@pps mailqueue]# for i in `ls`; do mv -f $i `echo $i | sed 's/^./q/'`; done
2、修改前面5个字母为zhaozh
[root@pps mailqueue]# for i in `ls`; do mv -f $i `echo $i | sed 's/^...../zhaozh/'`; done
3、修改后面5个字母为snail
[root@pps mailqueue]# for i in `ls`; do mv -f $i `echo $i | sed 's/.....$/snail/'`; done
4、在前面添加 _hoho_
[root@pps mailqueue]# for i in `ls`; do mv -f $i `echo "_hoho_"$i`; done
5、所有的小写字母变大写字母
[root@pps mailqueue]# for i in `ls`; do mv -f $i `echo $i | tr a-z A-Z`; done
6、去掉括号:for i in `ls`; do mv $i ${i/[/}; done
linux下shell批量修改文件后缀名
1.用rename命令修改后缀名,这个是最简单最省事的办法
[root@demo test_rename]# ll
总计 20
-rw-r--r-- 1 root root 0 09-27 00:57 rename1.log
-rw-r--r-- 1 root root 0 09-27 00:57 rename2.log
-rw-r--r-- 1 root root 0 09-27 00:57 rename3.log
-rw-r--r-- 1 root root 0 09-27 00:57 rename4.log
-rw-r--r-- 1 root root 0 09-27 00:57 rename5.log
[root@demo test_rename]# rename log txt *.log #把*.log改为*.txt
[root@demo test_rename]# ll
总计 20
-rw-r--r-- 1 root root 0 09-27 00:57 rename1.txt
-rw-r--r-- 1 root root 0 09-27 00:57 rename2.txt
-rw-r--r-- 1 root root 0 09-27 00:57 rename3.txt
-rw-r--r-- 1 root root 0 09-27 00:57 rename4.txt
-rw-r--r-- 1 root root 0 09-27 00:57 rename5.txt
[root@demo test_rename]#
2.用for、sed和mv修改后缀名
[root@demo test_rename]# ll
总计 20
-rw-r--r-- 1 root root 0 09-27 01:51 rename1.log
-rw-r--r-- 1 root root 0 09-27 01:21 rename2.log
-rw-r--r-- 1 root root 0 09-27 01:21 rename3.log
-rw-r--r-- 1 root root 0 09-27 01:21 rename4.log
-rw-r--r-- 1 root root 0 09-27 01:21 rename5.log
[root@demo test_rename]# for i in $(ls .)
> do
> mv $i $(echo $i|sed 's/\.log/\.txt/')
> done
[root@demo test_rename]# ll
总计 20
-rw-r--r-- 1 root root 0 09-27 01:51 rename1.txt
-rw-r--r-- 1 root root 0 09-27 01:21 rename2.txt
-rw-r--r-- 1 root root 0 09-27 01:21 rename3.txt
-rw-r--r-- 1 root root 0 09-27 01:21 rename4.txt
-rw-r--r-- 1 root root 0 09-27 01:21 rename5.txt
[root@demo test_rename]#
3.用find和xargs添加后缀名
[root@demo test_rename]# ll
总计 20
-rw-r--r-- 1 root root 0 09-27 02:20 rename1
-rw-r--r-- 1 root root 0 09-27 02:20 rename2
-rw-r--r-- 1 root root 0 09-27 02:20 rename3
-rw-r--r-- 1 root root 0 09-27 02:20 rename4
-rw-r--r-- 1 root root 0 09-27 02:20 rename5
[root@demo test_rename]# find . -type f |xargs -i mv {} {}.txt
[root@demo test_rename]# ll
总计 20
-rw-r--r-- 1 root root 0 09-27 02:20 rename1.txt
-rw-r--r-- 1 root root 0 09-27 02:20 rename2.txt
-rw-r--r-- 1 root root 0 09-27 02:20 rename3.txt
-rw-r--r-- 1 root root 0 09-27 02:20 rename4.txt
-rw-r--r-- 1 root root 0 09-27 02:20 rename5.txt
[root@demo test_rename]#
例子:我现在要把aaaaaaaaaaaaa.jpg重命名为aaaaaaaaaaaaa_MED.jpg 请使用如下命令: for i in *.jpg;do mv "$i" "${i%.jpg}_MED.jpg" ;done 同理aaaaaaaaaaaaa_MED.jpg重命名为aaaaaaaaaaaaa_LRG.jpg的方法: for i in *.jpg;do mv "$i" "${i%_MED.jpg}_LRG.jpg" ;done
今天又有同学问linux下怎样批量更改文件后缀名,这个问题被别人问到三次了,所以这里给出几个解决方法 一.rename解决 . Ubuntu系统下 rename 's/\.c/\.h/' ./* 把当前目录下的后缀名为.c的文件更改为.h的文件 2. CentOS5.5系统下 rename .c .h *.c 把当前目录下的后缀名为.c的文件更改为.h的文件 二.shell 脚本解决 #!/bin/bash #http://blog.csdn.net/longxibendi find ./ -name *.c | while read i do echo "$i"; mv $i.c $i.h done 三.find xargs 解决 find ./ -name "*.c" | awk -F "." '{print $2}' | xargs -i -t mv ./{}.c ./{}.h 注意,第三种方案是递归的更改,会更改当前目录下及其子目录下所有匹配文件
[Python]代码 #!/usr/bin/env python #coding=utf- import os,os.path import shutil,string dir = 'C:\\test' for i in os.listdir(dir): newfile = i.replace('.','_') oldfullfile = dir+'\\'+i newfullfile = dir+'\\'+newfile print oldfullfile print newfullfile shutil.mo
rename批量改名的perl脚本 ########################. jordan.sg # use strict; use File::Find; use Cwd; my $path = getcwd(); open(LOG, ">error.log") or die "open log file fail!"; print LOG "\n"; #my $object_count = ; sub wanted { #print "wanted $File::Find::name\n"; if ( -f $File::Find::name ) { if ( $File::Find::name =~ /t\.txt$/ ) { print LOG "$File::Find::name\n"; my $srcfile= $File::Find::name; my $file = $_; print LOG "- $_\n"; $file =~ s/t\.txt//; print LOG "> $file\n"; rename($srcfile, $file); } #$obj_count++; } find( \&wanted, $path ); #print LOG "rename $obj_count files\n"; ##打印处理文件数 close(LOG); #$File::Find::dir :当前路径名 #$_ :当前文件名不包含路径 #$File::Find::name :全路径的当前文件名
Shell批量改名 ======================================================================================== rename [ -v ] [ -n ] [ -f ] perlexpr [ files ] -v, --verboseVerbose: print names of files successfully renamed. -n, --no-actNo Action: show what files would have been renamed. -f, --forceForce: overwrite existing files. 简单的rename使用命令: 字母的替换 rename "s/AA/aa/" * //把文件名中的AA替换成aa 修改文件的后缀 rename "s/.html/.php/" * //把.html 后缀的改成 .php后缀 批量添加文件后缀 rename "s/$/.txt/" * //把所有的文件名都以txt结尾 批量删除文件名 rename "s/.txt//" * //把所有以.txt结尾的文件名的.txt删掉 一条命令: rename "s/.JPG/.jpg/" * 就完成了全部工作。 ======================================================================================== 用法: .将你要改名的文件都放在同一个文件夹下,运行”ls -l > oldnames”,然后“vi oldnames”,这时候看到的大概是这个样子: total drwxrwxr-x yanpeng yanpeng Sep : app drwxrwxr-x yanpeng yanpeng May bin drwxrwxr-x yanpeng yanpeng Jan : docpay .输入”ctrl+v”,移动光标,选中要删除的那一堆内容,其实就是文件名前面的那些列,输入“d”,得到的文件大概为 app bin docpay .删除掉第一行的空行,保存退出vi,然后”cp oldnames newnames”。 .修改newnames文件中想要改名的文件为新文件名 .将change_name.sh脚本放在你的那个放置文件的夹下,运行./change_name.sh就可以了(注意有执行权限,加执行权限的方法chmod a+x change_name.sh) change_name.sh脚本内容,拷贝下,存好就能用了 #!/bin/sh OLDNAMES='oldnames' NEWNAMES='newnames' fileline=`sed -n '$=' $OLDNAMES` echo $fileline index= while [ $index -le $fileline ] do oldname=`sed -n "${index}p" $OLDNAMES` newname=`sed -n "${index}p" $NEWNAMES` mv $oldname $newname index=`expr $index + ` done ========================================================================================
写个shell脚本对文件进行批量改名 不能不懂脚本, 北邮人技术笔试 最近需要干这么件事,把当前文件夹下文件名含有eee的都改成大写的EEE,比如21-eee.doc就要改成21-EEE.doc。 写了个shell脚本,会sed就不难了: for filename in *eee*; do newname=`echo $filename|sed -n ‘s/eee/EEE/p’`; mv $filename $newname;done 如果写成结构化会更清晰: for filename in *eee* do newname=`echo $filename|sed -n ‘s/eee/EEE/p’` mv $filename $newname done 然后还有一个任务,将每个文件的执行权限去掉,这样写: for filename in *; do chmod ugo-x $filename;done 结论: shell是个好东西,sed还是很有用的,不能小看正则表达式。
带空格文件名批量重命名:
find . -type f -print0|while read -d $'\0' file;do mv "$file" "$(echo $file|sed 's/ /_/g')";done
find . -type f -print0|while read -d $'\0' file;do mv "$file" "$(echo $file|sed 's/[[:space:]]/_/g')";done