Копировать и перезаписывать каталог рекурсивно
У меня есть каталог с именем "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
а также*
все в одной команде. Они могут быть катастрофической комбинацией ".