LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 1495|回复: 17

[脚本] 规范化文件名

[复制链接]
发表于 2005-1-20 16:20:13 | 显示全部楼层 |阅读模式
我经常下载一些电子书和歌曲,有些文件名里有空格,有些又有下滑线,十分难看,为了使自己使用起来方便、好管理、看着顺眼,我写了一个小脚本将文件名里的空格和下滑线转换成连字符"-",并检查文件名里是否有多个"-"连在一起,如果有就将它们改成一个"-"。还有一些功能欠缺,例如将每个单词首字母大写(of, the, a除外)。使用时请小心,之前最好做个测试。已知存在的问题是当文件名里有[]时无法正常工作,会将整个文件名复制一遍。
[PHP]
#!/bin/bash

# This script turns underlines and blanks in filenames to hyphens
# Written by Neo Anderson <ZeeGeek@gmail.com>
# Jan 19 2005

DIR=$1
TEMP_FILE=/tmp/ul2h.tmp

btoh() {
        exec < $TEMP_FILE
        while read FILE_NAME
        do
                BASE_NAME="`basename "$FILE_NAME"`"
                # change all blanks into hyphens
                while echo "$BASE_NAME" | grep " "
                do
                        BASE_NAME="`echo "$BASE_NAME" | sed s/' '/-/`"
                done
                # rename the target
                mv "$FILE_NAME" "${FILE_NAME%"$(basename "$FILE_NAME")"}$BASE_NAME"
        done
        rm $TEMP_FILE
}

ultoh() {
        exec < $TEMP_FILE
        while read FILE_NAME
        do
                BASE_NAME="`basename $FILE_NAME`"
                # change every underline to hyphen
                while echo $BASE_NAME | grep _
                do
                        BASE_NAME="`echo $BASE_NAME | sed s/_/-/`"
                done
                # rename the target
                mv $FILE_NAME "${FILE_NAME%$(basename $FILE_NAME)}$BASE_NAME"
        done
        rm $TEMP_FILE
}

finalize() {
        exec < $TEMP_FILE
        while read FILE_NAME
        do
                BASE_NAME="`basename $FILE_NAME`"
                # shorten hyphens
                while echo $BASE_NAME | grep -e --
                do
                        BASE_NAME="`echo $BASE_NAME | sed s/"--"/-/`"
                done
                # rename the target
                mv $FILE_NAME "${FILE_NAME%$(basename $FILE_NAME)}$BASE_NAME"
        done
        rm $TEMP_FILE
}

usage() {
        echo "Usage: ul2h.sh [directory...]"
}

if [ -z $DIR ]
then
        usage
else
        # get the file list of filenames containing blanks
        find $DIR -type f -iname "* *" > $TEMP_FILE
        btoh
        # get the file list of directory names containing blanks
        find $DIR -iname "* *" > $TEMP_FILE
        btoh
        # get the file list of filenames containing underlines
        find $DIR -type f -iname "*_*" > $TEMP_FILE
        ultoh
        # get the file list of directory names containing underlines
        find $DIR -iname "*_*" > $TEMP_FILE
        ultoh
        # check if there is any files which contain more than one hyphen
        # together
        find $DIR -iname "*--*" > $TEMP_FILE
        finalize
fi
[/PHP]
发表于 2005-1-20 17:31:00 | 显示全部楼层
楼主好伟大!
牛!!!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2005-1-20 19:29:32 | 显示全部楼层
请问有没有什么办法可以做到我未实现的那个功能?如果有什么新的想法就提出来
回复 支持 反对

使用道具 举报

发表于 2005-1-20 20:06:42 | 显示全部楼层
试试这个

  1. find -type f|tr -s ' |_'|tr ' |_' '-'
复制代码
回复 支持 反对

使用道具 举报

 楼主| 发表于 2005-1-20 21:25:07 | 显示全部楼层
超级感谢,这一句已经解决了大部分问题。白写代码了,呵呵
只需要find -type f | tr -s ' |_' '-'就够了
回复 支持 反对

使用道具 举报

发表于 2005-1-20 21:30:00 | 显示全部楼层
将_和空格 改为-
rename 's/[_\ ]/-/g' *
将多个--改为一个
rename 's/--*/-/g' *
将首字母大写. 不区分a ,the,等
rename 's/(^[a-z])/\u$1/' *
回复 支持 反对

使用道具 举报

发表于 2005-1-20 21:40:23 | 显示全部楼层
支持原创脚本

希望大家把日常操作中使用的有用的脚本放上来
有些脚本虽然简单(不是指楼主这个^_^),但的确能非常的方便解决问题
某些设计精巧的脚本还能给人非常好的启发
学以致用,是学之根本!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2005-1-20 22:14:41 | 显示全部楼层
Post by lastart
将_和空格 改为-
rename 's/[_\ ]/-/g' *
将多个--改为一个
rename 's/--*/-/g' *
将首字母大写. 不区分a ,the,等
rename 's/(^[a-z])/\u$1/' *

没用啊。如果改成sed倒是可以
回复 支持 反对

使用道具 举报

 楼主| 发表于 2005-1-20 22:16:40 | 显示全部楼层
Post by kiron
支持原创脚本

希望大家把日常操作中使用的有用的脚本放上来
有些脚本虽然简单(不是指楼主这个^_^),但的确能非常的方便解决问题
某些设计精巧的脚本还能给人非常好的启发
学以致用,是学之根本!

谢谢支持,我也是刚开始写,所以很多时候走了弯路,希望各位能指出我的不足之处。
回复 支持 反对

使用道具 举报

发表于 2005-1-20 22:40:42 | 显示全部楼层
Post by NeoAnderson
没用啊。如果改成sed倒是可以

都没用,还是某一句不对,

确认一下,你是要改文件名吧? :ask
我理解错了 :confused:
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表