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

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

У меня есть папка с именем 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/.

Связанный контент