Обычно Ваши мысли - все в правильном направлении. Определенные ответы на Ваши вопросы:
"Я могу выполнить крон, который продвинет через rsync или SMB к полю NAS?"
Да, абсолютно.
"Как я использовал бы rsync для выпадающего /home
каталог на моем удаленном сервере? Действительно ли это легко?
Да, вот команда, которую я использую. Проверьте rsync документы на объяснения:
rsync -vrltpz --force --delete -e ssh you@yourserver.com:/home/ /backups/myserver
Существует ли руководство новичка?
Многие, вот хорошая поваренная книга
Я могу сделать rsync от локальной машины?
Да. Вы выполнили команду выше от Вашей локальной машины.
(Как Вы заставляете крон делать это)?
Также не трудно. Использовать crontab
отредактировать Вашу таблицу крона:
$ crontab -e
Редактор обнаружится. Введите что-то вроде этого для резервного копирования один раз в день:
MAILTO=you@youremail.com
@daily rsync -vrltpz --force --delete ...
Крон имеет смехотворно мощный контроль, когда он будет работать, один поиск Google получит Вас много примеров и crontab документов.
Вы хотите что-то вроде этого?
#!/usr/bin/env bash
## This is the target path, the directory
## you want to copy to.
target="some/path with/spaces";
## Find all files and folders in the current directory, sort
## them reverse alphabetically and iterate through them
find . -maxdepth 1 -type f | sort -r | while IFS= read -r file; do
## Set the counter back to 0 for each file
counter=0;
## The counter will be 0 until the file is moved
while [ $counter -eq 0 ]; do
## If the directory has no files
if find "$target" -maxdepth 0 -empty | read;
then
## Move the current file to $target and increment
## the counter.
mv -v "$file" "$target" && counter=1;
else
## Uncomment the line below for debugging
# echo "Directory not empty: $(find "$target" -mindepth 1)"
## Wait for one second. This avoids spamming
## the system with multiple requests.
sleep 1;
fi;
done;
done
Этот сценарий будет работать, пока все файлы не были скопированы. Это только скопирует файл в $target
если цель пуста, таким образом, она зависнет навсегда, если другой процесс не удалит файлы, поскольку они входят.
Это повредится если Ваши файлы или $target
имя содержит новые строки (\n
) но должен согласиться с пробелами и другими странными символами.
Простое использование решения inotify-wait
от inotify-tools
:
#!/bin/bash
SOURCE=$1
DEST=$2
(
IFS=$'\n'
for FILE in $(find "$SOURCE" -type f | sort -r); do
mv "$FILE" "$DEST"
inotifywait -e moved_from "$DEST"
done
)
Объяснение:
(IFS=$'\n' ...)
Выполняет тело сценария в подоболочке где внутренний разделитель полей $IFS
установлен на символ новой строки, позволив for
цикл для обработки имен файлов с пробелами правильно. $'string'
синтаксис делает bash
интерпретируйте escape-последовательности в string
, так $'\n'
интерпретируется правильно как символ новой строки.
for FILE in $(find $SOURCE -type f | sort -r)
Создает отсортированный список реверса файлов в $SOURCE
и его подкаталоги и выполняют итерации через список одного файла во время, устанавливая значение $FILE
в следующий файл, который будет перемещен.
mv "$FILE" "$DEST"
Перемещает ток $FILE
кому: $DEST
каталог.
inotifywait -e moved_from "$DEST"
Устанавливает inotify
смотрите, который инициирован, когда файл перемещен из наблюдаемого каталога. Это заставит сценарий блокироваться в то время как $DEST
каталог освобожден. Это принято это $DEST
пусто, когда сценарий вызывается.
intotify
! Это повредится на именах файлов с пробелами все же.
– terdon♦
09.09.2013, 18:07
$target
это содержало пространство? Вы помещали его в кавычки как в моем примере? – terdon♦ 11.09.2013, 18:34target=foo/bar\ baz
иtarget="foo/bar baz"
должен работать, ноtarget="foo/bar\ baz"
не будет. Если это зависает, который, вероятно, означает, что цель не пуста, возможно, существует скрытый файл? Попробоватьls -a "$target"
проверять. Для отладки можно изменить сценарий, таким образом, он печатает файлы, он находит в цели, просто не прокомментируйте строку, которую я добавил подelse
, это распечатает любые файлы, найденные в цели. версия – terdon♦ 20.11.2013, 14:08