1

再帰的な名前変更操作 (Linux、Python を使用) を元に戻すにはどうすればよいですか?

LinuxでPythonを使用してプログラムを作成したいのですが、このプログラムはこの仕事をします:ファイル名に部分文字列Xが含まれている場合、フォルダー内のすべてのファイルの名前をバッチ再帰的に名前変更し、名前をYに変更します。例:マークダウンの名前をmdに変更すると、github.markdownは次のようになりますgithub.md に名前を変更します。

難しいのは、操作を元に戻す方法です。ファイル名を元に戻したい場合。例: github.md を github.markdown に戻します。

どのアルゴリズムとデータ構造を使用して、プログラムを設計し、シンプルに保つか?

4

3 に答える 3

2

元のファイル名と名前を変更したファイル名をファイルに保存します。より良い方法はありますか?

これが最も堅実なアプローチだと思います。名前の変更が損失を伴う場合でも機能します (つまり、名前が変更されたファイル名を見るだけで元のファイル名または場所を再構築できない場合)。

とはいえ、Linux を使用しているのであれば、ファイルをシンボリック リンクして、他の一連の名前でアクセスできるようにしてみませんか? Python では、これは を使用して実行できますos.symlink()

于 2013-03-17T08:49:01.950 に答える
0

リビジョン管理システムの使用を検討する必要があります。これにより、すべての変更を登録して元に戻すことができます。さまざまなプログラムから選択できます。

ディレクトリにテキスト ファイルしか含まれていない場合は、由緒あるRCSを使用できます。RCS と同様に、バージョン情報はリビジョン管理下のディレクトリに含まれているため、個人的にはgitが非常に気に入っています。git の利点は、バイナリ ファイルも処理できることと、移動と名前変更を処理できることです。CVSSubversionなどの代替手段では、通常、リポジトリを設定する必要があります。

于 2013-03-17T10:19:10.590 に答える
0

エラーまたは例外が発生した場合は、操作全体を元に戻したいと思います。

ケースに応じて、次の 2 つのアプローチを使用します。

1) LIFO キュー (クラス Queue.LifoQueue) を使用します。

すべての操作が完了したら、LIFO Queue に対して 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 operation

2) 「買う前に試してみる」

操作をシミュレートする方法がある場合は、それらすべてをシミュレートし、機能する場合はすべて実行します。元に戻す必要はありません。

于 2013-03-17T09:50:37.557 に答える