Копировать и перезаписывать каталог рекурсивно

У меня есть каталог с именем "isting_folder "и другой каталог с именем" temp "

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

Поскольку каталог содержит веб-страницы, это должно быть сделано таким образом, чтобы обеспечить минимальное время простоя.

Есть ли способ сделать это? Какую команду я должен использовать для достижения этой цели?

3 ответа

Решение

Если оба orig_folder а также temp находятся на одном физическом жестком диске, переименование (перемещение) их по сути происходит мгновенно. Это означает, что вы могли бы просто сделать

mv orig_folder foo && mv temp orig_folder && rm -rf foo

Что переименую orig_folder в fooзатем переименуйте temp в orig_folder и, наконец, удалить foo, На одной файловой системе два mv Операции займут почти мгновенно (0,004 секунды в моей системе).

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

mv /path/to/temp . && mv orig_folder foo && mv temp orig_folder && rm -rf foo

Вы пробовали rsync?

Из ваших требований я считаю, что это лучший инструмент. Он заменит только те файлы, которые были изменены, скопирует новые и сможет удалить те, которые ушли в оригинал.

$ rsync -av --delete temp/ existing_folder/

Обратите внимание на косую черту после температуры, это необходимо, потому что вы хотите синхронизировать содержимое. Без этого он создал бы директорию temp внутри существующей папки.

Аргумент delete заставляет файлы, которые больше не находятся во времени, удаляться в существующей папке.

Вы также можете выполнить пробный прогон, если добавите аргумент -n. Он скажет вам, какие изменения будут сделаны, ничего не делая.

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

rm -rfv <existing_folder>/* && cp -r <temp>/* <existing_folder>

Но, как сказано в ответе по ссылке, обратите внимание, что:

  • /* часть очень важна. Если вы поставите пробел перед * , он удалит все ваши файлы в вашем текущем каталоге.
  • это не удалит скрытые файлы
  • "быть очень (очень) осторожным, играя с rm , -r а также * все в одной команде. Они могут быть катастрофической комбинацией ".
Другие вопросы по тегам