Intereting Posts
Какой уровень OS / drivers / X / Wayland может вызвать проблемы с сенсорной панелью как в synaptic, так и в libinput? Сценарий Bash не читает ввод Найти элементы списка в другом файле Перенос i386 qemu VM на amd64 VM host Как я могу что-то хранить, что угодно, компилировать навсегда? Что может сделать передачу init = / path / to / program в ядро, а не запускать программу как init? Логика Bash назад в одной системе, но не другая Как закрыть любое окно в Awesome WM? Как автоматически обновить ip в файле hosts от гостя VirtualBox? Можно ли изменить пользователя файла при управлении учетными записями пользователей? Синтаксис декларации оболочки оболочки Shell, () vs {} Выбрав дистрибутив для старого ПК, какую проблему совместимости нужно искать? Использовать символическую ссылку для перенаправления? Почему не взаимодействует bash login shell игнорировать / etc / profile при вызове su -? Генерирование файлов различной изменчивости?

Как перемещать и воссоздавать папку одновременно?

У меня есть папка, называемая statistics на сервере Ubuntu, в которой файлы данных регулярно хранятся. Как переименовать папку statistics в backup-xx при восстановлении папки statistics которая будет доступна для хранения новых файлов?

Файлы в папке statistics создаются PHP file_put_contents .

Я предпочитаю переименовывать папку, так как в папке statistics есть много файлов.

 mv statistics backup-xx && mkdir statistics 

Это переименовало бы существующий каталог statistics в backup-xx , и если это удастся, он будет продолжать создавать новый каталог statistics .

Для более атомной операции подумайте о создании statistics-001 каталога statistics-001 (или аналогичной, возможно, заменив 001 на сегодняшнюю дату в подходящем формате) и символическую ссылку на нее, называемую statistics :

 mkdir statistics-001 ln -s statistics-001 statistics 

Когда вы хотите «повернуть» это так, чтобы новые данные попадали в чистый каталог, сначала создайте каталог, а затем заново создайте ссылку statistics :

 mkdir statistics-002 ln -sf statistics-002 statistics mv statistics-001 backup-001 

Таким образом, любая запись программы в каталог statistics (то есть каталог, на который указывает эта символьная ссылка) никогда не сможет найти его.

Если вам нужны специальные разрешения или права собственности в каталоге, на который указывает statistics , установите их перед (пере) созданием ссылки.

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

Невозможно автоматически заменить каталог другим каталогом. Вы можете переместить старый каталог и создать новый каталог:

 mv statistics backup-xx mkdir statistics 

Но это оставляет небольшое окно времени, в течение которого statistics не существует. Это проблема, если какой-либо процесс может в любое время удалить файлы в каталоге.

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

 mkdir "statistics-$(date +%Y%m%d)" 

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

 ln -s … statistics 

Чтобы заменить каталог, сначала создайте новый каталог и новую символическую ссылку, а затем переместите его, чтобы перезаписать старую символическую ссылку. Обратите внимание, что ни простой mv на символической ссылке, ни простой ln -s будут делать этого: они создадут запись внутри целевого каталога. GNU coreutils ln -snf не подходит либо потому, что он удаляет существующую символическую ссылку перед созданием новой, что оставляет небольшое временное окно, в течение которого путь не существует. Вы можете использовать mv -T GNU coreutils для новой символической ссылки.

 new_dir="statistics-$(date +%Y%m%d)" mkdir "$new_dir" ln -s statistics.new mv -Tf statistics.new statistics 

Не переименовывайте каталог вообще. Вы сказали, что предпочитаете переименовывать каталог, потому что в нем много файлов. Единственная причина, по которой я могу думать о том, что вы захотите этого, заключается в том, что копирование файлов займет слишком много времени. Однако перемещение (т.е. переименование) файлов происходит мгновенно, пока они перемещаются в местоположение в той же файловой системе. Я предполагаю, что это то, что вы можете делать, поскольку, если вы меняете файловые системы, mv займет столько же времени, сколько и cp независимо от того, перемещает ли он каталог или его содержимое.

Итак, просто выполните:

 mkdir backup-xx && mv statistics/* backup-xx 

Если вам нужно также получить скрытые файлы, вы можете сделать:

 mkdir backup-xx && mv statistics/* statistics/.* backup-xx 

Или, если вы используете bash :

 shopt -s dotglob; mkdir backup-xx && mv statistics/* statistics/.* backup-xx 

Таким образом, каталог всегда присутствует, но вы все равно перемещаете его содержимое в простой и быстрой работе.

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

 mkdir -p <path>/backup-xxx mv statistics/* <path>/backup-xxx/.