
У меня есть папка с именем statistics
на сервере Ubuntu, в которой регулярно хранятся файлы данных. Как мне переименовать statistics
папку в backup-xx
при повторном создании statistics
папки, чтобы она была доступна для хранения новых файлов?
Файлы в statistics
папке создаются PHP file_put_contents
.
Я предпочитаю переименовать папку, так как в ней много файлов statistics
.
решение1
Нет никакого способаатомарнозаменить каталог другим каталогом. Вы можете переместить старый каталог, а затем создать новый каталог:
mv statistics backup-xx
mkdir statistics
Но это оставляет небольшой промежуток времени, в течение которого statistics
не существует. Это проблема, если какой-то процесс может в любой момент удалить файлы в каталоге.
Для эффективной атомарной замены каталога необходимо использовать символические ссылки. Создайте каталог, имя которого включает временной период с самого начала:
mkdir "statistics-$(date +%Y%m%d)"
(или как вы хотите выбрать соглашение об именовании каталогов). Создайте символическую ссылку с фиксированным именем на текущее местоположение:
ln -s … statistics
Чтобы заменить каталог, сначала создайте новый каталог и новую символическую ссылку, а затем переместите ее, чтобы перезаписать старую символическую ссылку. Обратите внимание, что ни plain mv
на символической ссылке, ни plain ln -s
не сделают этого: они создадут запись внутри целевого каталога. GNU coreutils ln -snf
также не подходит, поскольку он удаляет существующую символическую ссылку перед созданием новой, что оставляет небольшое временное окно, в течение которого путь не существует. Вы можете использовать GNU coreutils mv -T
на новой символической ссылке.
new_dir="statistics-$(date +%Y%m%d)"
mkdir "$new_dir"
ln -s statistics.new
mv -Tf statistics.new statistics
решение2
mv statistics backup-xx && mkdir statistics
Это переименует существующий statistics
каталог в backup-xx
, и если это удастся, то будет создан новый statistics
каталог.
Для более атомарной операции рассмотрите возможность создания каталога 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.
решение3
Не переименовывайте каталог вообще. Вы сказали, что предпочитаете переименовывать каталог, потому что в нем много файлов. Единственная причина, по которой я могу это придумать, заключается в том, что копирование файлов займет слишком много времени. Однако,движущийся(т. е. переименование) файлов происходит мгновенно, если они перемещаются в место в той же файловой системе. Я предполагаю, что это то, что вы хотите сделать, поскольку если вы меняете файловые системы, это 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
Таким образом, каталог всегда будет на месте, но вы по-прежнему сможете перемещать его содержимое с помощью простой и быстрой операции.
решение4
Вы можете переместить содержимое папки статистики в новый каталог, а не перемещать саму папку. Если вы перемещаете всю папку, вам придется выполнить другую команду, чтобы изменить разрешения каталога.
mkdir -p <path>/backup-xxx
mv statistics/* <path>/backup-xxx/.