如何使递归重命名操作(Linux,使用python)可逆?
我想写一个程序在Linux下使用python,这个程序做这个工作:批量递归重命名文件夹中的所有文件,如果文件名有子字符串X,重命名为Y,例如:将markdown重命名为md,github.markdown将重命名为github.md。
困难的部分是如何使操作可逆?如果我想改回文件名。示例:将github.md改回github.markdown。
如何设计程序并保持简单,使用什么算法和数据结构?
发布于 2013-03-17 16:49:02
将原始文件名和重命名后的文件名保存到一个文件中,有什么更好的方法吗?
我认为这是最健壮的方法。即使重命名是有损的(例如,如果您不能仅通过查看重命名的文件名来重建原始文件名或位置),它也会工作。
也就是说,既然您使用的是Linux,为什么不简单地symlink这些文件,使它们可以使用另一组名称进行访问呢?在Python语言中,这可以使用os.symlink()来完成。
发布于 2013-03-17 17:50:38
如果出现错误或异常,我认为您想要反转整个操作。
根据具体情况,我将使用两种可能的方法:
1)使用后进先出队列(类Queue.LifoQueue)。
在每个操作完成后,对LIFO队列执行put()。
如果出现错误或异常,只需get()即可。
一些示例代码:
import os, Queue.LifoQueue
stack = Queue.LifoQueue()
from = 'original.txt'
to = 'new.txt'
if os.system('mv %s %s' % (from, to)) == 0: # execute operation
stack.put('mv %s %s' % (to, from)) # save reverse operation
os.system(stack.get()) # execute reverse operation2)“先试后买”
如果有一种方法可以模拟操作,然后模拟所有操作,如果它们有效,则执行所有操作,不需要反转任何东西。
发布于 2013-03-17 18:19:11
您应该考虑使用revision control system。这样,所有的更改都可以注册和撤消。有many different programs可供选择。
如果你的目录只包含文本文件,你可以使用古老的RCS。就我个人而言,我非常喜欢git,因为像RCS一样,版本信息包含在受修订控制的目录中。git的优点是它还可以处理二进制文件,并且可以处理移动和重命名。像CVS和Subversion这样的替代方案通常需要您设置一个存储库。
https://stackoverflow.com/questions/15458983
复制相似问题