[Shell] 巧用rename批量修改文件名

作者:Ajian 发布时间:February 24, 2011 分类:Shell

批量修改文件名,是很多人遇到的问题,很多人都利用for find mv sed awk来进行批量的修改,但是利用好了rename其实批量修改就是一条简单命令解决的问题。
实例:
原文件名:
./20110214/xxmm_api_20110214.ip-11-98-241-106.report
./20110214/xxmm_total_20110214.ip-11-98-241-106.report
./20110214/xxmm_user_20110214.ip-11-98-241-106.report
./20110214/xxmm_20110214.ip-11-98-241-106.log
要修改成:
./20110214/yymm_api_20110214.ip-11-98-241-106.report
./20110214/yymm_total_20110214.ip-11-98-241-106.report
./20110214/yymm_user_20110214.ip-11-98-241-106.report
./20110214/yymm_20110214.ip-11-98-241-106.log
而且是有很多这样的目录 另外还有一些 xxmm_uid*.report的文件又是不能被修改的。
现在不需要使用那些复杂的循环进行处理直接一条命令搞定。
rename xxmm yymm ./*/xxmm_{api,total,user}_*.{report,log}
xxmm 到 yymm 或者其它名称为了更方便的通用,
写一个简单的脚本prename.sh

#!/bin/bash
oldprefix=$1
newprefix=$2
weblogpath=$3
weblogpath=${weblogpath:-"/data2/pic/weblog"}
renamepetparty(){
mkdir -p test && touch ./test/${oldprefix}_{api,total,user}.{report,summary}
rename $oldprefix $newprefix ./*/${oldprefix}_{api,total,user}*.{report,summary}
}
if [ -d "$weblogpath" ];then
cd $weblogpath && renamepetparty
rm -rf test
fi

使用方法:
bash prename.sh xxmm yymm
或者如果不是默认的/data2/pic/weblog 指定目录
bash prename.sh xxmm yymm /data2/log
NOTICE:
mkdir -p test && touch ./test/${oldprefix}_{api,total,user}.{report,summary}
为了解决rename的一个BUG ,在批处理的时候一旦没有匹配到其中一个都会进行中断。
如:./*/${oldprefix}_api*.report 都匹配不到 那么就不会再继续下去,批处理也就失去意义了。
这个BUG真是让人郁闷,所以办法就是要么写成多条进行多种情况的替换,要么就是先创建后替换。

=====================华丽分割线==========================
悲剧的rename bug
rename虽然是批量修改 尤其手动修改的时候相当的方便,但是他的批量是有上限的。
由于我替换的都是365*7*N的量 他就直接报 参数过多
rename :Argument list too long
只好再一次修改脚本

#!/bin/bash
oldprefix=$1
newprefix=$2
weblogpath=$3
weblogpath=${weblogpath:-"/data2/pic/weblog"}

renamepetparty(){
         touch ${oldprefix}_{api,total,user}_temp8888.{report,summary}
         rename $oldprefix $newprefix ${oldprefix}_{api,total,user}*.{report,summary}
}

if [ -d "$weblogpath" ];then
    for i in `ls $weblogpath`
    do
        cd $weblogpath/$i ; renamepetparty
    done
fi

find $weblogpath -name "*_temp8888*" -type f | xargs rm -f 

增加一个for循环进入每一个目录进行替换,但还是同样要面对上一个BUG的问题 所以在每个目录也创建一个临时文件
添加上“ temp8888”这样的标记就不会跟原来的文件有冲突了,最后还是要批处理删除的。

可爱又可气的rename命令。

openSUSE配置小记

作者:Ajian 发布时间:February 23, 2011 分类:openSUSE

h1. SUSE修改主机名
配置习惯了redhat系列的系统,配置SUSE发现没有/etc/sysconfig/network 主机名怎么修改呢?

方法1. 通过yast2管理工具进行配置
在console中运行yast2工具修改主机名(hostname)
# yast2 network
对于配置未经配置的网卡
"Network cards configuration"中"Network cards configuration"中“Configure...”
对于修改已配置网卡的设置
"Network cards configuration"中"Network cards configuration"中“Changev...”
“Network address setup”中“Detailed settings”单击“Host name and name server”
在“Host name”输入框中输入主机名,在“Domain name输中数入域名,如果没有域名,接受缺省的

方法2. 通过修改配置文件的方式并运行命令修改主机名
修改/etc/HOSTNAME文件,在此文件中保存主机名.
如果你用第一个方法修改完后会发现这个文件已经修改成了。
然后运行命令设置主机名
# /etc/rc.d/boot.localnet start

方法3. 运行 sysctl 动态改变主机名
# sysctl -w kernel.hostname=linuxserv1

h1. 启动akonadi
如果不启动这个很多信赖的软件无法正常工作,但我默认用的就是ROOT,如果是你用的其它用户可能不会有类似的问题
如何用ROOT用户启动akonadi?
I encounter the same errors too. Actually, I am using Gentoo. As fduraibi mentioned, it is just because mysqld can't start as root. I add "user=root" in the Akonadi local mysql configuration file (on my computer, it is /root/.local/share/akonadi/mysql.conf), and Akonadi server can be started successfully.
修改/root/.local/share/akonadi/mysql.conf 在最后添加user=root即可。

h1. dropbox同步安装KDE

安装脚本kde-dropbox.sh

#!/bin/bash
test -d /usr/lib64 && myarch="x86_64" || myarch="x86"
echo "Install dropbox (arch: $myarch) without nautilus in KDE4"
echo "Please make sure you have a dropbox account!"
echo "Continue ? (y or n)"
read yn
if [ $yn == "y" ]; then
    echo "Installing ..."
    #wget -N -O dropbox-$myarch.tar.gz http://www.dropbox.com/download/?plat=lnx.$myarch
    tar -zxof dropbox-$myarch.tar.gz
    mv .dropbox-dist ~
    echo "Do you want to startup Dropbox automatically when login? (y or n)"
    read autoyn
    if [ $autoyn == "y" ]; then
        ln -s ~/.dropbox-dist/dropboxd ~/.kde4/Autostart/
    fi
    echo "Do you want to add Dropbox startup to your menu? (y or n)"
    read menuyn
    if [ $menuyn == "y" ]; then
        echo "Icon=$HOME/.dropbox-dist/dropbox.png" >> dropbox.desktop
        echo "Exec=$HOME/.dropbox-dist/dropbox start -i" >> dropbox.desktop
        mkdir -p ~/.local/share/applications
        mv dropbox.desktop ~/.local/share/applications/
        mv dropbox.png ~/.dropbox-dist/
    fi
    echo "Starting setup ..."
    ~/.dropbox-dist/dropboxd &
    echo "Done!"
fi

因为dropbox的官网被屏掉了,可以想办法下载到该软件后软件,要不然你可以打开注释的直接进行下载和安装。

当然相关的信赖了解下更好。
依赖
- sqlite3
- python >2.5
- kdialog
- klipper

hosts:

174.36.30.67 dropbox.com
174.36.30.71 www.dropbox.com
75.101.129.115 dl.dropbox.com

openSUSE 11.3 64位 skype

作者:Ajian 发布时间:February 17, 2011 分类:openSUSE

   skype 原来在官网提供的下载是不支持64位的,http://skype.tom.com/download/linux.html 下载openSUSE 11+ skype-2.1.0.81-suse.i586.rpm 可以看到是32的软件。
安装不会有任何报错的和提示的。但无法使用,主要是缺少了很多32支持的包。

安装上以下软件:
* libasound2-32bit
* xorg-x11-libXv-32bit
* xorg-x11-libs-32bit
* libqt4-32bit
* libqt4-x11-32bit
* libpng12-0-32bit

简单点:
zypper in libasound2-32bit xorg-x11-libXv-32bit xorg-x11-libs-32bit libqt4-32bit libqt4-x11-32bit libpng12-0-32bit