LinuxSir.cn,穿越时空的Linuxsir!

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

问一个文件重命名的命令

[复制链接]
发表于 2009-7-19 19:07:26 | 显示全部楼层 |阅读模式
我从别人那里拷了近20G的音乐
放在/home/stesen/music下,该目录下有好几层子目录
用find命令导出一个playlist
再用mplayer播放该playlist

问题是有很多歌我不喜欢,删除时因为文件名和目录名带空格,要转义或打开文件管理器,很不方便
我自己想用该命令把空格改为“-”
find /home/stesen/music/ * |rename "s/\ /-/g"
但是会出现很多warning,而且自己觉得效率低下,有没有更好的办法?

我不太会shell脚本,也一点都不懂perl...

谢谢大家!



ps
这个命令还有个问题:
比如有个文件~/music/a a/b b/c c
执行一次只是修改了文件夹a a
要执行3次才能把文件c c改为c-c
发表于 2009-7-19 19:57:25 | 显示全部楼层
你试试行不行
  1. find  /home/stesen/music/ -exec rename "s/\ /-/g" {} \;
复制代码
我也是从别处找来的……
回复 支持 反对

使用道具 举报

 楼主| 发表于 2009-7-19 20:01:07 | 显示全部楼层
貌似不行,这个-exec是是么意思?
回复 支持 反对

使用道具 举报

发表于 2009-7-19 20:09:25 | 显示全部楼层
把 find 的结果送给 -exec 后的命令……

我这里是可以的:

  1. diveinto@debian:~$ mkdir test
  2. diveinto@debian:~$ cd test/
  3. diveinto@debian:~/test$ touch foo\ bar.ogg
  4. diveinto@debian:~/test$ touch foo\ bar\ 2.mp3
  5. diveinto@debian:~/test$ touch apple.mp3
  6. diveinto@debian:~/test$ ls
  7. apple.mp3  foo bar 2.mp3  foo bar.ogg
  8. diveinto@debian:~/test$ find . -exec rename "s/\ /-/g" {} \;
  9. diveinto@debian:~/test$ ls
  10. apple.mp3  foo-bar-2.mp3  foo-bar.ogg
  11. diveinto@debian:~/test$

复制代码
回复 支持 反对

使用道具 举报

 楼主| 发表于 2009-7-19 20:18:25 | 显示全部楼层
嗯,行的,只是结果输出非常慢,不知为什么。。。。

这个命令也无法一次性修改“~/music/a a/b b/c c”这类文件,而且会报错

效果和我原先的差不多么:flash:
回复 支持 反对

使用道具 举报

发表于 2009-7-19 20:27:49 | 显示全部楼层
我用easytag改,因为不只文件名,TAG也要改.
回复 支持 反对

使用道具 举报

 楼主| 发表于 2009-7-19 20:32:29 | 显示全部楼层
Post by slash1117;2007685
我用easytag改,因为不只文件名,TAG也要改.


我的想法是集成一个脚本,先改名,再播放,最后最好能在conky上输出信息
播放问题不大,但是第一步过不了

easytag的话这个脚本就不那么“智能”了,呵呵。。。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2009-7-19 21:06:55 | 显示全部楼层
rename是不是先cp一个文件再删除原来文件的?warning信息都是说X X不会被rename了,因为X-X文件已存在

这个命令多执行几次,到了全部改完以后就没有warning了
find /home/stesen/music/ * |rename "s/\ /-/g"
回复 支持 反对

使用道具 举报

发表于 2009-7-20 00:08:40 | 显示全部楼层
应该可以用一两句命令来完成,但我不会……
也可以用一些简单的脚本来完成:


  1. python space_rename.py music/
复制代码

  1. #!/usr/bin/env python
  2. # coding: utf8

  3. import os
  4. import sys

  5. if len(sys.argv) != 2:
  6.     print 'Usage: ' + sys.argv[0] + ' [root folder]'
  7.     exit()

  8. def rename(path):
  9.     char_org = ' '
  10.     char_new = '-'

  11.     node = os.path.basename(path)
  12.     path_new = os.path.join( os.path.dirname(path),
  13.                              node.replace(char_org, char_new) )

  14.     if not os.path.exists(path_new):
  15.         os.rename(path, path_new)
  16.         print 'rename %s to %s' % (path, path_new)
  17.         return path_new

  18.     return path



  19. def main():
  20.     cwd = os.path.realpath(sys.argv[1])
  21.     queue = [cwd]

  22.     while len(queue) > 0:
  23.         dir = queue.pop()

  24.         for node in os.listdir(dir):
  25.             path = os.path.join(dir, node)
  26.             if os.path.isfile(path):
  27.                 rename( path )
  28.             elif os.path.isdir(path):
  29.                 queue.insert(0, rename(path) )

  30. main()

复制代码

注:本脚本未经测试
回复 支持 反对

使用道具 举报

 楼主| 发表于 2009-7-20 08:13:33 | 显示全部楼层
额,python俺不懂。。。

我最后是这么做的:
  1. for ((i=1; i<=10; i=i+1))
  2. do
  3. find /home/stesen/music/ * |rename "s/\ /-/g"
  4. done
复制代码
每次循环改一层名字,循环10次(应该够了)

典型的笨办法
回复 支持 反对

使用道具 举报

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

本版积分规则

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