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

service (ftp) => вы можете увидеть имя службы в файле c: / services, пожалуйста, проверьте

{
    port = 21
    disable = no
    socket_type = stream
    protocol = tcp
    wait = no
    user = root
    server = /usr/bin/ftpd
    instances = 20
}
9
29.04.2017, 15:12
4 ответа
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 (т.е. в каталог, на который указывает эта символическая ссылка), всегда1 не найдет его.

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

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

7
27.01.2020, 20:04

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

mv statistics backup-xx
mkdir statistics

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

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

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

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

ln -s … statistics

Чтобы заменить каталог, сначала создайте новый каталог и новую символическую ссылку, а затем переместите ее, чтобы перезаписать старую символическую ссылку. Обратите внимание, что ни простой mv в символической ссылке, ни простой 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
12
27.01.2020, 20:04

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

mkdir -p <path>/backup-xxx
mv statistics/* <path>/backup-xxx/.
1
27.01.2020, 20:04

Не переименовывайте каталог вообще. Вы сказали, что предпочитаете переименовывать каталог, потому что в нем много файлов. Единственная причина, по которой я могу думать, что вам это может понадобиться, заключается в том, что копирование файлов займет слишком много времени. Однако перемещение (т. е. переименование) файлов происходит мгновенно, если они перемещаются в место в той же файловой системе. Я предполагаю, что это то, что вы должны делать, поскольку, если вы меняете файловые системы, 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

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

3
27.01.2020, 20:04

Теги

Похожие вопросы