Python shutil.move: нечетные ссылки - PullRequest
2 голосов
/ 21 октября 2011

Сценарий, который я написал, предназначался для перемещения каталогов отдельных дней из старого местоположения в новое местоположение со структурой, подобной этой:

/old/YYYY/MM/DD
/new/YYYY/MM/DD

и для другой задачи (не связанной с перемещением данных) я создал мягкую ссылку в новом месте, как это (это была моя первая ошибка):

/new/2011/09 -> /old/2011/09

Мой сценарий необходим для вызова этой функции:

for d in os.listdir("/old/2011/09"):
    shutil.move(os.path.join("/old/2011/09/", d), os.path.join("/new/2011/09", d))

После запуска моего скрипта 2011/09 был пуст в обоих. Я имел это происходить на работе с неархивированными данными ... большая проблема. Мой вопрос заключается в том, почему shutil.move () не выдавал мне ошибку о том, что дневной каталог, который я перемещал, уже существовал? Каждый день внутри 09 должен был быть одним и тем же каталогом из-за мягкой ссылки.

/new/2011/09/01 == /old/2011/09/01

Разве вызов shutil.move не проверяет src и dst перед вызовом shutil.copy2? Из документов: «Каталог назначения еще не должен существовать». или это только когда он использует переименование? И если это имеет значение, то и старые, и новые локации были glusterfs.

shutil.move Документация

shutil.copy Документация

Спасибо за предоставленную ясность.

РЕДАКТИРОВАТЬ / ОБНОВИТЬ : Я отправил вопрос в список python, спрашивающий, почему это поведение существует, и спросил, следует ли его изменить ( архив списка ). Они предложили мне подать отчет об ошибке. Выполняя тесты для отправки ошибки, я обнаружил, что это было исправлено в Python 2.7. Вы можете увидеть различия в источнике в объявлении функции перемещения: Python 2.6 и Python 2.7 .

Это все еще делает перемещение / переименование, но волшебным образом не удаляет весь каталог.

1 Ответ

1 голос
/ 22 октября 2011

Это сводится к этим двум строкам в shutil.move :

        copytree(src, real_dst, symlinks=True)
        rmtree(src)

где src='old' и real_dst='new/old'.Команда copytree копирует old в подкаталог new/old.Это идет хорошо, хотя это может быть не то, что вы хотели.

rmtree удаляет каталог old.Это проблема, поскольку new теперь является символической ссылкой.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...