linux使用find 批量重命名文件

今天单位系统部署新版本内容,看似一切风平浪静,两个小时候快要接近尾声时却发生了一件很恶心的事。

由于我的系统在上线新功能后需要由上游系统提供一些初始化文件过来供我的系统进行数据库的原始功能初始化操作,但上游的管理员一时的大意将传输过来的大批量的文件名统统少了一位,这是最让人抓狂的事。如果数据量小的话还可以手工来逐个目录进去修改名字。但上万条的文件名看着就眼晕,无奈之下只能自己写个脚本给他们善后吧,话不多说上脚本。

示例:目录结构:
/tmp/file/input/baidu/image/{jpg,gif}/20190823/SINA_SAFEID_CN0110000_ACUP_INIT_20190823_2130.dat(就是示例目录,不用纠结内容o(╯□╰)o)
vim renameFile.sh
#!/bin/bash

DIRPATH="/tmp/file/input/baidu/image/{jpg,gif}/20190823/*"
for file in $(find $(eval ls $DIRPATH));do
    DIR=$(dirname $file)
    cd $DIR
    OLDNAME=$(basename $file)
    NEWNAME=$(echo $OLDNAME |sed 's/CN011000*/CN0110000/g')
    if [ "$OLDNAME" == "$NEWNAME" ];then
        echo "已经重命名,无需改动!"
    else
        echo "old ! = new" 
        mv $OLDNAME $NEWNAME 2>/dev/null
[ $? -eq 0 ] && echo "重命名成功!" || echo "重命名失败!"
    fi  
done

吐槽一下:原以为只是使用一个find 加sed命令即可解决问题,没想到还是踩了一些坑,也算是自己的基础知识点不够吧,在这记录一下给自己提个醒,正常情况下find命令查找文件或目录时所给的路径一般为字符串,如果需要使用变量的方式来传递要查找路径,直接使用$ARGS方式则会有无法找到路径的错误提示,这是因为变量中涉及到的大括号无法展开为真实路径而导致报错,此时则需要eval命令来解决这个问题,eval可以将得到的结果进行解析,如果得到的还是一个命令,则会将该命令所获得的结果作为最终结果输出。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章