今天面试问了一道Shell题,答的不是很好。回来查了一下找到正确答案。

  假定某个目录下有若干日志文件,文件名是log.2011mmddhhmmss(mmddhhmmss为任意的时间戳),更改成log.2012mmddhhmmss。

  这里必然用到正则表达式,首先想到一个Perl的实现

#!/usr/bin/perl
if ($#ARGV != 0) {
    print "usage: command dirname";
    exit(1);
}
my $basedir = $ARGV[0];
opendir(DIR, $basedir);
@files = readdir(DIR);
foreach (@files)
{
if ($_ =~ /log\.2011\d{10}/)
{
$newfile = $_;
$newfile =~ s/(log\.)(2011)(\d*)/${1}2012$3/;
rename $_, $newfile;
}
}

   用bash实现关键用for i in `ls`来获得各个文件名,然后用管道和sed。

#!/usr/bin/bash

cd $1;

for file in `ls`;
do
         mv $file `echo $file|sed 's/\(log\)\.2011\(.*\)/\1\.2012\2/'`
done;