Chinaunix首页 | 论坛 | 博客
  • 博客访问: 262970
  • 博文数量: 41
  • 博客积分: 2013
  • 博客等级: 大尉
  • 技术积分: 523
  • 用 户 组: 普通用户
  • 注册时间: 2010-01-08 23:13
文章分类

全部博文(41)

文章存档

2010年(41)

我的朋友

分类:

2010-05-29 00:11:33

在linux下常会遇到文件名乱码的文件,比如从网上下载,或者解压缩。当然,这多半与中文编码有关。一般我们会选择删除或重命名这些文件,但好像一般都是用鼠标点到文件管理器中,再手动删除或重命名的。这对于双手习惯不离键盘的人们来说,无疑是种煎熬。

在命令行下操作文件名乱码的文件,主要的困难在于无法准确地获取文件名。在删除文件的时候有一个笨办法

rm -i *


这是删除所有文件,但是每个文件删除之前都要让你回答一下。但如果想重命名文件就没那么好办了。

解决办法不是没有,那就是使用find命令。find命令有一个-inum选项,它是根据文件的inode来搜索文件名,并且,find还有-exec选项,支持对搜索到的文件执行某些命令。
首先,要通过dir获取inode值

dir -i *


假设某文件名乱码的文件的inode为12345,那么将其重命名和删除的命令分别为

find . -inum 12345 -exec mv {} newFileName \;

find . -inum 12345 -exec rm {} \;


注意,最后的分号不是bash中的分号运算符,而是find命令本身的一部分,所以要用转义以示区分。中间的一对大括号用来代替find搜索到的文件名。

如果每次都写这么长的命令确实挺烦的,你可以将其缩写成一条命令。

alias imv="mvfile(){ find . -inum \$1 -exec mv {} \$2 \;;}; mvfile "

alias irm="rmfile(){ find . -inum \$1 -exec rm {} \;;}; rmfile "


这里的$1, $2就是bash里的第一个参数和第二个参数。这里需要注意几点,第一点是,函数中的$1将脚本中的$1给覆盖了,即这里的$1是用户定义的函数(比如mvfile)的第一个参数。第二点是,之所以要对$1和$2转义,是因为函数定义嵌套在一个字符串中,bash解释器首先要解析alias命令,若不对$1进行转义,$1将被解析为脚本中的参数,显然这并非我们的意图。待alias的解析完成之后,就只剩下一个完整的函数定义了。另外,注意find前面有一个空格。
   当然,你也可以将函数定义单独拿出来,这时候是不需要转义的,但这个函数明显不会用于其它地方,最好还是不要增加系统的負担了。

你可以把上面的两条alias語句放到~/.bashrc中,然后你就可以方便地用自定义的命令执行重命令和删除操作了

imv 12345 newFileName

irm 12345


阅读(1759) | 评论(0) | 转发(0) |
0

上一篇:g++遇到的奇怪问题

下一篇:U盘装linux有感

给主人留下些什么吧!~~