转自:http://zhguiqiang.blog.163.com/blog/static/9993752201021151628822/
shell批量修改文件名
最简单:rename file file1 file??
自己写的:
#!/bin/bash
#NeoX
folder=/root/folder
cd $folder
num=0
for filename in `ls $folder`; do
let num=$num+1
#old filename:prefix+with . suffix, new filename:continuous digit +with . suffix
mv $filename $num`echo $filename|sed 's//([a-zA-Z]*_*[0-9]*/)/./(./)//./2/'`
done
exit
网上收集的:
A 加后缀
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' `
B 改后缀(.old => .new)
1. rename
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/' `
C 去后缀 (*.dat => *)
1. mv $files `echo $files |sed 's//.dat//' `
2. mv $files `echo $files|tr .dat (4空格)`
D 改前缀 (re* => un*)
1. mv $files un${$files#re}
2. mv $files `echo $files | tr re un`
##########
ls |awk '{printf("mv %s %s_tmp.BIL/n"),$0,$0}'|sh
for i in *.BIL;do
mv "$i" "$(echo $i|awk -F. '{sub(/.*/,"&_tmp.",$1);print}')"
done
#!/bin/sh
#程序名: yzl_batch_rename.sh
#功能 :批量改名;
#版本 :20040914 v1.00
#yzl
if [ $# -ne 2 ]
then
echo "Version: v1.00"
echo "Usage :`basename $0` [begindate] [enddate]"
echo "Example: `basename $0` 20040521 20040620"
echo ""
exit 0
fi
begindate=$1
enddate=$2
date
DATE_S=`date +%Y%m%d`
FILELIST=./filelist.${DATE_S}
test -f ${FILELIST} && rm -f ${FILELIST}
ls *.BIL | grep -v ssp | grep -v filelist | grep -v yzl >${FILELIST}
echo "START rename, please wait..."
echo "begindate:$begindate"
echo "enddate :$enddate"
for filename in `cat ${FILELIST}`
do
thqsrq=`echo ${filename} | cut -c1-8`
if [ $thqsrq -ge $begindate -a $thqsrq -le $enddate ]
then
echo ${filename} >> filelist.${DATE_S}.end
tmp_filename=`echo ${filename} | cut -c1-10`
cp ./${filename} ./after/${tmp_filename}_ssp.BIL
fi
done
echo "BATCH RENAME DONE!"
for i in *.bil;do mv "$i" "$(echo $i|sed 's/[0-9][0-9]*/&_tmp/')"; done
rename .bil _tmp.bil *.bil
for i in *.BIL ;do mv $i ${i/.BIL/_tmp.BIL};done
其中${i/.BIL/_tmp.BIL}是将变量i中的字符串.BIL替换为_tmp.BIL
#######从配置文件中读取配置选项值#######
########BBY##########################
src_dir=/home02/bill07 #要修改的文件所在的目录,要根据实际修改此处
dest_dir= #如果有必要可以加上目的目录
cd $src_dir
echo "begin at `date /"+%Y/%m/%d %H:%M:%S/"`." > $src_dir/mvbill.log
ls *_3.dat|awk -F'_3.' '{print "mv "$0" "$1"_7.dat"}' >$src_dir/mv.sh
chmod +x mv.sh
cat mv.sh>>$src_dir/mvbill.log
mv.sh>>$src_dir/mvbill.log
#cp -p $crc_dir/*_7.dat $dest_dir/
echo "end at `date /"+%Y/%m/%d %H:%M:%S/"`." >> $src_dir/mvbill.log
SCO5.0.6
#/bin/sh
ls | sed 's/^.........../mv &.BIL &_tmp/' | sh
ls | cut -f1 -d'.' | awk '{ print "mv "$1".BIL "$1"_tmp.BIL" }' | sh
ls *.BIL | tr -d ".BIL" | xargs -I + mv +.BIL +_tmp.BIL
Shell 批量重命名以“.log”结尾的文件
pre="M";
for filename in `find . -name "*"`
do
if [ -f $filename ]
then
if [ ${filename%.log} != $filename ]
then
mv $filename ./$pre${filename#./};
fi
fi
done
find -type f| xargs -i -n1 mv {} {}a
find . -type f -exec mv {} "{}ts" /;