在linux下常会遇到文件名乱码的文件,比如从网上下载,或者解压缩。当然,这多半与中文编码有关。一般我们会选择删除或重命名这些文件,但好像一般都是用鼠标点到文件管理器中,再手动删除或重命名的。这对于双手习惯不离键盘的人们来说,无疑是种煎熬。
在命令行下操作文件名乱码的文件,主要的困难在于无法准确地获取文件名。在删除文件的时候有一个笨办法
这是删除所有文件,但是每个文件删除之前都要让你回答一下。但如果想重命名文件就没那么好办了。
解决办法不是没有,那就是使用find命令。find命令有一个-inum选项,它是根据文件的inode来搜索文件名,并且,find还有-exec选项,支持对搜索到的文件执行某些命令。
首先,要通过dir获取inode值
假设某文件名乱码的文件的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
|
阅读(1754) | 评论(0) | 转发(0) |