Je recherche une commande / un script permettant de copier les derniers fichiers modifiés (jusqu'à) 10 Go sur un autre ordinateur.
Donc, s'il y a 4 fichiers de 4 Go chacun, seuls 2 d'entre eux doivent être transférés par le script.S'il y a 12 fichiers de 1 Go, seuls les 10 plus récents doivent être transférés.
scripting
rsync
cp
synchronization
exussum
la source
la source
Réponses:
Voici un script qui fait exactement ce que vous avez demandé.
Les exigences
Les détails
Il utilise
rsync --dry-run
pour construire une liste de fichiers qui seraient transférés (ce sont les fichiers modifiés). Il utilise ensuite une combinaison dedu
etls
pour obtenir les tailles de fichier et mtime. Il trie ensuite les fichiers par mtime, puis les boucle jusqu'à ce que la taille totale dépasse un seuil. Enfin, il appelle à nouveau rsync avec uniquement les fichiers dont la taille totale a été modifiée le plus récemment et sous le seuil.Le script est un peu moche, mais ça marche. Une grande limitation est qu'il doit être exécuté sur la machine contenant le répertoire rsync. Il peut être modifié pour utiliser ssh pour utiliser un répertoire distant, mais cette excersize est laissée au lecteur.
Enfin, les
rsync
options sont codées en dur dans le script, mais c'est un changement facile si vous souhaitez les spécifier sur la ligne de commande. De plus, les calculs pour calculer la taille se font en octets. Cela peut être changé en kilo / méga / gigaoctets en modifiant l'appel à du et en réduisant le seuil du même facteur.Usage
où
rsync-from-directory
est un répertoire local etrsync-to-directory
n'importe quel répertoire local ou distant. Les options par défaut sont codées en dur comme-avz
et le seuil par défaut est codé en dur comme10GiB
.Le scénario
la source
if (( "$size" > "$THRESHOLD" ))
conditionnel, ajoutez une vérification (avantbreak
)i==0
et si ouiecho $f >> /tmp/rsyncfilelist
,.J'utiliserais rsync "--dry-run" (ou "-n") pour obtenir la liste des fichiers les plus récents. Ensuite, j'utiliserais un autre rsync avec l'option "--files-from = -" pour envoyer les fichiers. Entre les deux, il y a du "laid" perl .
Quelque chose comme ça :
Notez que je n'ai pas testé avec plus de 10 Go, peut-être que perl débordera à une certaine limite; pour résoudre cela, au lieu de compter les octets, utilisez Kbytes:
EDIT: J'ai remarqué que cette première solution ne trierait pas les fichiers par mtime , voici une solution plus complète (similaire au script bash qui a été posté par une autre personne).
la source
Vous pouvez analyser la sortie triée de
du
. En supposant que les utilitaires GNU:POSIX, en supposant qu'aucun nom de fichier ne contient un caractère de nouvelle ligne:
Notez que
du
traverse les sous-répertoires. Pour éviter cela, indiquez surdu
quels fichiers vous souhaitez opérer. Plus généralement, vous pouvez utiliserfind
pour filtrer les fichiers.la source
rsync
au lieu decp
.