Ignorer les fichiers utilisés (enregistré) utilisant rsync

J'ai un serveur SFTP auxquels les clients téléchargent constamment des fichiers volumineux. Je veux tout de même copier tout

complet

(Entièrement chargé) Fichiers sur un autre ordinateur pour le traitement. Je ne veux pas copier le fichier actif. Y a-t-il un moyen d'y parvenir? J'utilise actuellement rsync, Mais prêt à passer à autre chose.
Invité:

Emilie

Confirmation de:

Pour vérifier si le fichier est actuellement ouvert (Si le fichier actuellement écrit est probablement ouvert par n'importe quel processus), La manière standard est d'utiliser

lsof

:

if lsof /your/file > /dev/null; then echo "file currently open"; fi

Vous pouvez utiliser ce fragment pour filtrer les résultats de la recherche pour les fichiers non ouverts et les utiliser pour l'alimentation. rsync:

find . -type f -exec sh -c 'if ! lsof `readlink -f {}` > /dev/null; then echo `basename {}`; fi' \; | tr '\n' '\0' | rsync -avz --from0 --files-from=- ./ user@host:destination/

Quelques notes:


readlink -f

Nous sommes nécessaires pour indiquer le chemin complet du fichier, lsof ne prend que le tout


tr '\n' '\0'

Imiter découvre

-print0

Blanche

Confirmation de:

L'un des problèmes ici est de déterminer si tous les fichiers sont écrits. Il n'y a pas de moyen idéal pour le faire. Je pense que la meilleure chose que tu puisses faire - Il est facile de vérifier la marque temporaire du dernier changement dans les fichiers et copier uniquement les fichiers qui n'ont pas été modifiés dans quelques minutes.


rsync

Par lui-même ne peut pas faire cela, mais vous pouvez le combiner avec
http://man7.org/linux/man-pages/man1/find.1.html
:

cd /path/to/directory/with/files
find ./ -type f -mmin +5 -print0 | rsync --archive --verbose --from0 --files-from=- ./ yourotherserver:targetdir/

Pour casser cette commande, il effectue deux choses:

Il utilise

find ./ -type f -mmin +5 -print0

Définir tous les fichiers qui n'ont pas été changés pour au moins 5 minutes.

Puis il transmet cette liste dans

rsync

Utilisant

--from0

et

--files-from

options. Cela fera

rsync

considérer que les fichiers que

find

Déterminé.

Pour répondre aux questions, connectez-vous ou registre