2013-03-17 4 views
1

Как сделать рекурсивную операцию переименования (Linux, используя python) обратимой?Как сделать рекурсивную операцию переименования (Linux, используя python) обратимой?

Я хочу написать программу под Linux и используя python, эта программа выполняет эту задачу: Пакетная рекурсивная переименовать весь файл в папку, если имя файла имеет подстроку X, переименовать в Y, Пример: переименовать уценку в md, github .markdown будет переименован в github.md.

Жесткая часть - как сделать операцию обратимой? Если я хочу изменить имя файла. Пример: смените github.md на github.markdown.

Как создать программу и сохранить простую, используя алгоритмы и структуру данных?

Моя мысль: сохранить исходное имя файла и переименованное имя файла в файл, какие-либо более подходящие подходы?

ответ

2

Сохраните исходное имя файла и переименованное имя файла в файл, лучше всего подходит?

Я думаю, что это самый надежный подход. Он будет работать, даже если переименование будет потеряно (т. Е. Если вы не можете восстановить исходное имя файла или местоположение, просто просмотрев переименованное имя файла).

Это, так как вы используете Linux, почему бы не просто symlink файлы, чтобы сделать их доступными под другим набором имен? В Python это можно сделать, используя os.symlink().

+0

+1 для символической ссылки.OP может извлечь выгоду из объяснения «как symlink» – inspectorG4dget

+0

Большое спасибо, symlink - это новый подход, я никогда не думал об этом раньше, умная часть заключается в том, что он доставляет потенциальную проблему, вызванную значительным изменением местоположения или структуры для работы система, ОС будет обрабатывать ее для вас, блестящая идея, для ее реализации потребуется некоторое время. – Albert

0

Я предполагаю, что вы хотите изменить всю операцию, если есть ошибка или исключение.

Я хотел бы использовать два возможных подхода, в зависимости от случая:

1) Использование ЛИФО очереди (класс Queue.LifoQueue).

Выполняйте операцию put() в очереди LIFO после завершения каждой операции.

Если есть ошибка или исключение, просто получите().

Некоторые примеры кода:

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) «Попробуй, прежде чем купить»

Если есть способ для имитации операции, а затем имитировать их всех, и если они работают, выполнять их все, не нужно ничего менять.

+0

Да, ваше предположение верно, если есть ошибка или исключение, я хочу отменить всю операцию. Кстати, ваше решение хорошо, просто и понятно, спасибо. – Albert

0

Вам следует рассмотреть возможность использования revision control system. При этом все изменения могут быть зарегистрированы и отменены. Есть many different programs на выбор.

Если ваш каталог содержит только текстовые файлы, вы можете использовать почтенный RCS. Лично я очень люблю git, потому что, как и RCS, информация о версии содержится в каталоге, находящемся под контролем редакции. Преимущество git заключается в том, что он также может обрабатывать двоичные файлы и может обрабатывать перемещения и переименовывать. Альтернативы, такие как CVS и Subversion, обычно требуют, чтобы вы создали репозиторий.

+0

Большое спасибо, система контроля версий - это вариант, это тяжелое «оружие», даже мастер - Линус делает такие вещи намного проще и проще, создавая git, он все еще тяжелый инструмент, тяжелые инструменты мощные, но сложные , поэтому, если бы я не был ужасно загнан в угол, я бы не использовал RCS. – Albert