LinuxSir.cn,穿越时空的Linuxsir!

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

怎么批量从文件内取得文件内容并给文件改名

[复制链接]
发表于 2010-8-14 16:45:18 | 显示全部楼层 |阅读模式
我有一些html文件,我需要将它个的文件名改成它们内容中<title>的标题名,并批量的改。

我现在有一些思路,使用find ./ -type f -name "*.html" 找出所有的html文件,然后使用sed取得title后面的内容,然后再改名,还请大家指点一下,如果使用sed取得我需要的内容,并改名


<title>标题-xxxxxxxxxxx</title>
我只需要取得标题,不需要后面的-xxxx内容,然后将这个文件的文件名改为标题.html
发表于 2010-8-15 18:30:47 | 显示全部楼层
find ./ -type f -name "*.html"|while read a ;do mv "$a" "${a%/*}/$(sed -n '/<title>/s,^.*<title>\| *-[^-]*</title>.*$,,gp' "$a").html";done
回复 支持 反对

使用道具 举报

发表于 2010-8-18 17:19:45 | 显示全部楼层
能用perl不?
这个是perl版本的rename,一般来说ubuntu应该是perl版本的,别的我就不知道了,可以从cpan安装

  1. find ./ -type f -name '*.html' -exec rename  'while(<>){if(m{<title>([^-]+)-(?:.(?<!</title>))+</title>}){$_=$1.".html";last;}}' '{}' +
复制代码
回复 支持 反对

使用道具 举报

 楼主| 发表于 2010-8-19 21:07:07 | 显示全部楼层
能不能介绍一下命令的具体意思,我想学习一下
回复 支持 反对

使用道具 举报

发表于 2010-8-19 22:21:37 | 显示全部楼层
  1. find ./ -type f -name "*.html"
复制代码
查找所有.html文件
  1. |while read a ;do
复制代码
通过管道用while读入查找到的文件名,赋给变量a,(每次读入一行,若文件名里包含换行符会出错!)
  1. mv "$a"
复制代码
用mv命令改名
  1. "${a%/*}/
复制代码
留下路径名,(删除最后一下/以及之后的字符)
  1. $(sed -n '/<title>/s,^.*<title>\| *-[^-]*</title>.*$,,gp' "$a").html";
复制代码
-n表示不自动输出内容,
/<title>/含有<title>的行,
s,,,gp就是s///gp替代,替代内容为空就是删除,g是重复替代,p是打印(输出)
^.*<title>从行的起始到<title>为止的所有字符
\|或者
*-[^-]*</title>.*$ </title>前的最后一个-(包括它前面的所有空白)一直到</title>再到行末的所有字符
  1. done
复制代码
循环结束
回复 支持 反对

使用道具 举报

 楼主| 发表于 2010-8-20 11:00:46 | 显示全部楼层
:Coffee::Coffee::Coffee:谢谢
回复 支持 反对

使用道具 举报

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

本版积分规则

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