批量重命名文件后缀名脚本

批量重命名文件后缀名小脚本, 比如 .3gp 命名为 .mp3,请自行修改后缀名和正则表达式。


#!/usr/bin/perl
use File::Find;

# 批量重命名文件的后缀名
# 比如 .3gp 命名为 .mp3

my $gp_root = "/data"; 
my $old_suffix = "\.3gp\$";
my $new_suffix = ".mp3";

my @result;

sub process {
    push @result,$File::Find::name if(/$old_suffix/);
}

sub rename_file {
    foreach my $old (@result){
        (my $new = $old) =~ s/$old_suffix/$new_suffix/;
        if (-e $new){
            warn "Can't rename $old to $new: $new exists\n";
        }elsif (rename $old,$new){
            print "$old --> $new ...OK\n";
        }else {
            warn "rename $old to $new failed: $!\n";
        }
    }
}

find(\&process,$gp_root);
&rename_file;

Linux系统启动流程

Linux系统启动流程大概总结下来是这么一个过程:

    POST-->BootLoader(MBR)-->Kernel(硬件探测、加载驱动、挂载根文件系统、/sbin/init)-->init(/etc/inittab:设定默认级别、系统初始化脚本、启动及关闭对应级别的服务、启动终端)

详细分析上面的流程

第1步:

    1.POST 打开电源按钮,CPU会把位于CMOS中的BIOS程序加载到内存里面执行,BIOS会探测并识别主板上的所有硬件,然后按照BIOS程序里面设定的启动顺序(1.光驱 2.硬盘 3.软驱 等),它会挨个去这些设备里面找启动设备,一旦找到就停止寻找,如:第一个先从光驱找到,但是没有找到光盘,那么找第二个硬盘,找到硬盘也不一定能启动,要看硬盘是否包含MBR,如果有MBR那就从硬盘启动,如果没有就继续向下寻找,如果一直没有找到可启动的设备,那么本次启动宣告失败

    开电之后,CPU就到出厂时指定的内存地址空间(是由内存和CMOS组成)去加载BIOS程序(存储在CMOS里面),BIOS是由一系列的汇编指令组成,用于进行硬件检测(把检测到的结果存储到内存的低地址空间里,是由于BIOS 的寻址能力有限),BIOS首先会探测有几块内存以及其他设备是不是都基本正常,有任何问题就会报警,就无法往下启动,接着去扫描ISA总线和PCI总线去查找各关联到的设备,并且能指挥各硬件完成中断注册和IO端口注册

- 阅读剩余部分 -

使用Jsch时遇到的 Auth fail 问题

在使用Jsch连接服务器的过程中,时常遇到 Auth fail 这个问题,表面的意思就是验证失败,经过搜索和实验,出现这个情况的原因可能是以下2条:

1.你所使用的用户不能进行远程登录,比如CentOS6,默认root不能进行远程登录

2.服务器的配置文件 /etc/ssh/sshd_config 中 GSSAPIAuthentication 的值是 yes

针对以上这2条原因,可以尝试用如下方法来解决:

1.在 /etc/ssh/sshd_config 文件中,PermitRootLogin yes 把这行的注释取消掉,也就是允许root远程登录

2.在 /etc/ssh/sshd_config 中 GSSAPIAuthentication 修改为 no, 或者在代码中增加
session.setConfig("userauth.gssapi-with-mic", "no"),同时不要忘了 session.setConfig("StrictHostKeyChecking", "no");

3.为了加快SSH的登录速度,可以把 /etc/ssh/sshd_config 文件中 UseDNS yes 修改为 no

4.之后重启sshd服务,再次访问速度就会有明显的提升.

删除过期日志脚本

脚本功能:

删除过期日志文件

内容如下:


#!/usr/bin/perl
use File::Path 'rmtree';

my $expire_day = 20;
my $delete_log = "delete_log.log";
my $date = &getDateTime();
my $pattern = ".+[0-9]{4}\-[0-9]{2}+\-[0-9]{2}.+";  # 修改为自己的正则表达式

my @will_delete_file_root = ("/data/log1","/data/log2");                

open DELETELOG,">>","$delete_log" or warn "Can't open $delete_log: $!";
print DELETELOG "############# $date #################\n";

foreach (@will_delete_file_root){
    &deleteExpireFile($_);
}
print DELETELOG "\n";
close DELETELOG;

sub deleteExpireFile(){
    my $will_delete_filedir = shift @_;
    chdir "$will_delete_filedir" or die "Can't chdir to $will_delete_filedir: $!";
    opendir FILEDIR,"$will_delete_filedir" or die "Can't open $will_delete_filedir: $!";
    foreach (readdir FILEDIR){
        next if ($_ eq '.');
        next if ($_ eq '..');
        if ($_ =~ /$pattern/ and -M $_ > $expire_day) {
            print DELETELOG "$_\n";
            rmtree($_);
        }
    }
    close FILEDIR;
}

sub getDateTime() {
      my ($sec, $min, $hour, $mday, $mon, $year) = (localtime)[0..5];
      $date = sprintf "%4d-%02d-%02d %2d:%02d:%02d" ,$year + 1900,$mon + 1 ,$mday ,$hour ,$min ,$sec;
}