У меня есть папка statistics
на сервере Ubuntu, в которой регулярно хранятся файлы данных. Как я могу переименовать statistics
папку backup-xx
при повторном создании statistics
папки, чтобы быть доступным для хранения новых файлов?
Файлы в statistics
папке созданы PHP file_put_contents
.
Я предпочитаю переименовывать папку, так как в ней много файлов statistics
.
bash
shell-script
files
rename
Googlebot
источник
источник
Ответы:
Это приведет к переименованию существующего
statistics
каталогаbackup-xx
, а в случае успеха он продолжит создание новогоstatistics
каталога.Для более элементарной операции рассмотрите возможность создания каталога
statistics-001
(или аналогичного, возможно, путем замены001
текущей даты в подходящем формате) и символической ссылки на него, называемойstatistics
:Если вы хотите «повернуть» это так, чтобы новые данные попадали в чистый каталог, сначала создайте каталог, а затем заново создайте
statistics
ссылку на него:Таким образом, любая программа для написания в
statistics
каталоге (то есть каталог , в котором эта символическая ссылка указывает) никогда 1 не найти.Если вам нужны особые права доступа или права доступа к каталогу, на который он
statistics
указывает, установите их перед (повторным) созданием ссылки.1 Или , скорее, таким образом, время , которое программа будет без действительного целевого каталога сведен к минимуму, насколько это практически возможно с помощью стандартных инструментов Unix.
источник
chown --reference=backup-xx statistics ; chmod --reference=backup-xx statistics
можете установить владельца и разрешения. В идеале вы должны сделать это перед переименованием, так чтоmkdir new ; chown ; chmod ; mv stats backup ; mv new stats
процесс типа.ln -sf
не атомно. Указано, что нужно отсоединить старую символическую ссылку, а затем создать новую, которая обязательно не является атомарной. Вместо этого вы должны создать дополнительную временную символическую ссылку и использоватьrename
функцию (например, черезmv
команду), чтобы атомарно заменить старую. Смотрите мой подход к этому здесь: git.musl-libc.org/cgit/musl/tree/tools/…Нет никакого способа атомарно заменить каталог другим каталогом. Вы можете переместить старый каталог, а затем создать новый каталог:
Но это оставляет небольшое окно времени, в течение которого
statistics
не существует. Это проблема, если какой-то процесс может в любой момент удалить файлы из каталога.Чтобы эффективно атомарно заменить каталог, вам нужно использовать символические ссылки. Создайте каталог, имя которого включает период времени с начала:
(или, тем не менее, вы хотите выбрать соглашение об именах каталогов). Создайте символическую ссылку с фиксированным именем на текущее местоположение:
Чтобы заменить каталог, сначала создайте новый каталог и новую символическую ссылку, а затем переместите ее, чтобы перезаписать старую символическую ссылку. Обратите внимание, что ни простая
mv
символическая ссылка, ни простая неln -s
будут этого делать: они создадут запись в целевом каталоге. GNU coreutils такжеln -snf
не подходит, потому что он удаляет существующую символическую ссылку перед созданием новой, что оставляет небольшое временное окно, в течение которого путь не существует. Вы можете использовать GNU coreutilsmv -T
по новой символической ссылке.источник
busybox
'ln -sf
Также не является атомарной, я не знаю ни одной реализации , что есть.openat()
CWD). Я бы только переместил содержимое каталога на новый. Это все еще небезопасно в отношении открытых файлов, но немного лучше. В случае сомнений используйте,logrotate
которые должны уважать такие вопросы наилучшим образомsymlink
Системный вызов не перезаписывает существующий файл, поэтому, к сожалению, невозможно напрямую переключать символическую ссылку.rename
Системный вызов будет перезаписывать существующий файл, но раздражающе нет переносимого способа сделать это в оболочке; это возможно с GNU coreutils благодаря-T
опции.Не переименовывайте каталог вообще. Вы сказали, что предпочитаете переименовывать каталог, потому что в нем много файлов. Единственная причина, по которой я могу подумать, что вы захотите, это потому, что копирование файлов займет слишком много времени. Однако перемещение (т. Е. Переименование) файлов происходит мгновенно, если они перемещены в местоположение в одной и той же файловой системе. Я предполагаю, что это то, что вам нужно сделать, так как, если вы меняете файловые системы,
mv
это займет столько времени, сколькоcp
бы он ни перемещал: каталог или его содержимое.Итак, просто сделайте:
Если вам нужно также получить скрытые файлы, вы можете сделать:
Или, если используете
bash
:Таким образом, каталог всегда есть, но вы все равно перемещаете его содержимое в простой и быстрой операции.
источник
Вы можете переместить содержимое папки статистики во вновь созданный каталог, а не перемещать саму папку. Если вы переместите всю папку, вам придется выполнить другую команду, чтобы изменить права доступа к каталогу.
источник