2010-02-04 2 views
0

Je veux copier un dossier de mon RAID X-Serve sur un disque dur externe sur un X-Serve . Les deux disques sont sur le même serveur, donc la copie est assez facile. J'utilise la commande ditto:Bash: Copie un dossier plein de fichiers et de dossiers vers un disque dur externe, mais seulement s'il y a suffisamment d'espace pour compléter la copie

ditto -rsrc /Volumes/WadXServeRaid/Users/ $destinationpath/Users/ 

Cependant, je ne veux que la copie pour commencer s'il y a suffisamment d'espace sur le disque de destination. Je sais que je peux utiliser la commande DU pour évaluer le disque de destination, mais je ne sais pas comment obtenir la taille d'un dossier et le comparer à l'espace de destination.

Toutes les suggestions seraient grandement appréciées!

Répondre

0
#!/bin/bash 

######Change These Vars###### 
srcFolder="/Volumes/WadXServeRaid/Users" 
dstFolder="/path/to/some/external/folder/Users" 
dstPartition="/dev/hdd1" 
overheadbytes=104857600 
############################# 

dstBytes=$(df -B1 | awk -v dpart="$dstPartition" '$1 ~ dpart {print $4}'); 
read srcBytes _ < <(du -s "$srcFolder" 2>/dev/null); 

if (($dstBytes > $srcBytes + $overheadBytes)); then 
    ditto -rsrc "$srcFolder" "$dstFolder" 
fi 

Modifier

  • Ajouté $ overheadBytes avec une valeur par défaut de 100 Mo par commentaire discussion
  • Je n'ai pas passé la partition/mount point comme argument à 'df' sur parce qu'il semble avoir besoin de privilèges root et je ne voulais pas force un tel script à être exécuté comme racine.
2
du -s name_of_folder_to_be_copied 

vous donnera la taille totale du dossier et des éléments contenus (fichiers et dossiers). Avec df, vous pouvez vérifier l'espace libre sur le lecteur de destination. Comparez les deux tailles, et vous avez terminé (attention, du vous donne la taille en octets, df en blocs de 512 octets, ou 1024 octets si vous utilisez l'option -k). Editer: pour être plus précis, vous devez analyser la sortie df. Une façon d'obtenir que l'espace libre (en ko) sur le disque de destination pourrait être:

df -k mount_point_of_destination|tail -1|sed "s/ */ /g"|cut -d ' ' -f 4 

Rappelez-vous, vous pouvez obtenir le même résultat avec awk, par exemple. Je viens d'utiliser sed et coupé parce que c'est la première façon dont je pensais bon pied au large de la chauve-souris;)

+0

Je suis d'accord avec l'idée générale. Cependant, il y aura des problèmes dans les détails, lorsque les nombres sont très proches: Si le système de fichiers de destination a plus de préfixe par fichier, la copie peut nécessiter beaucoup plus d'espace que l'original. – ndim

+0

Oui, c'est vrai. Une façon possible de le lire (presque) en toute sécurité serait de prendre la taille totale du dossier source et de l'incrémenter, disons, de 10% avant de le comparer à l'espace libre sur le disque de destination. Évidemment, le pourcentage devrait idéalement être déterminé de telle manière qu'il soit suffisamment élevé pour être sûr qu'il y ait assez d'espace (même si un autre utilisateur/programme écrit sur le disque de destination), et en même temps assez bas. ne pas bloquer une copie qui serait sinon complète sans erreur. A condition que le fs soit le même sur les deux disques, cela ne devrait poser aucun problème ... – lightman

Questions connexes