2008-12-22 7 views
3

Nous migrons les dossiers de départ vers un nouveau système de fichiers, et je cherche un moyen de l'automatiser en utilisant Perl ou un script shell. Je n'ai pas beaucoup de choix dans les langages de programmation car les systèmes sont des clusters de stockage propriétaires qui devraient rester aussi inchangés que possible. Tâche: Sous répertoire/home/J'ai les dossiers de départ des différents utilisateurs aaa, bbb, ccc, ... et ils ont certaines permissions et la propriété de l'utilisateur/groupe qui doivent rester intacts lors de la migration vers/newhome /. Voici exemple de ce qui doit être migré de/home:Comment puis-je migrer de manière non récursive des répertoires avec Perl ou shell?

drwxr-xr-x 3 aaaaa xxxxxxxxx 4096 Feb 26 2008 aaaaa/ 
drwxrwxrwx 88 bbbbbbb yyyyyy  8192 Dec 16 16:32 bbbbbbb/ 
drwxr-xr-x 6 ccccc yyyyyy  4096 Nov 24 04:38 ccccc/ 
drwxr-xrwx 36 dddddd yyyyyy  4096 Jun 20 2008 dddddd/ 
drwxr-xr-x 27 eee  yyyyyy  4096 Dec 16 02:56 eee/ 

Ainsi, exactement les mêmes dossiers avec des autorisations et des propriétés doivent être créés sous/newhome. La copie/déplacement de fichiers ne devrait pas être un problème, car il sera traité plus tard.

Quelqu'un a-t-il travaillé sur un tel script? Je suis vraiment nouveau à Perl, j'ai donc besoin d'aide.

Répondre

8

cp de drapeau -a maintenir l'autorisation, les temps de modification, etc. Vous devriez être en mesure de faire quelque chose comme:

for a in `ls /home`; do cp -a "/home/$a" "/newhome/$a" ; done 

Essayez avec un répertoire pour voir si ce que ce que vous avez besoin avant automatisant .

EDIT: Vous pouvez désactiver la copie récursive des fichiers en utilisant rsync ou tar comme mentionné par Paul. Avec rsync, les sous-répertoires sont encore conservés, mais les fichiers ne sont pas copiés:

sudo rsync -pgodt /home/ /newhome/ 

Je n'ai pas essayé --no-récursion de goudron, ne peut donc pas commenter.

EDIT 2: Une autre façon

find /home/ -maxdepth 1 -print | sudo cpio -pamVd /newhome 

Reference

+0

Super 1 doublure, merci! Est-il possible de dire à cp de ne pas copier les sous-dossiers et les fichiers de chaque répertoire utilisateur? En d'autres termes, créez uniquement les répertoires utilisateur supérieurs sous/home sans copier le contenu. –

+0

@DV: La page man indique que cp -a est équivalent à cp -dpr ... puisque -r gère la récursivité, cp -dp devrait faire ce que vous voulez sans récursion. –

+0

Adam, cp omet les répertoires si -r n'est pas spécifié, donc -dp ne s'appliquerait qu'aux fichiers AFAIK. – codelogic

3

Cela va créer les répertoires et copier tous les fichiers.

cd /home; tar cvBf - . | (cd /newhome; tar xvpBf -) 

Si vous ne voulez pas copier tous les fichiers, vous pourriez être en mesure de le faire en ajoutant un à la première commande tar « --no-récursion ».

+0

Je vais essayer cela.Je ne cherche aucune récursivité, merci pour le conseil! –

+0

Malheureusement, je Je n'ai pas copié les permissions/propriétés lorsque je l'ai essayé. Peut-être que je ne faisais pas quelque chose de bien. –

+0

@DV: ajoute 'sudo' avant' tar'. – jfs

1

Si ces répertoires sont sur le même système de fichiers, pourquoi ne pas simplement

cp -p /home/* /newhome/ 
+0

Je vais essayer - je peux monter le/newhome/via le NFS. Merci! –

+0

Cela fonctionne, mais il y a toujours de la récursivité (c'est-à-dire qu'il copie aussi tous les sous-répertoires et fichiers). Existe-t-il un moyen de dire à cp de ne pas faire de récursivité? –

4

Vous ne pouvez conserver le propriétaire et le groupe si vous faites l'opération de copie root. La plupart des commandes données fonctionneront - les tar et les options cp -rp le feront. La seule astuce à s'inquiéter concerne les répertoires non inscriptibles, mais c'est un problème pour les utilisateurs non root. Ensuite, je tends à utiliser:

(cd /home; find . -depth) | cpio -pvdumB /newhome 

L'option -depth signifie que le fichier et les sous-répertoires sont traités avant les répertoires eux-mêmes, de sorte que l'autorisation sur le répertoire sans écriture n'est définie après tout le contenu du répertoire ont été copiés dedans. Vous pouvez également utiliser un 'sort -r' pour lister les fichiers dans l'ordre inverse, ce qui garantit que les répertoires apparaissent après leur contenu.

Questions connexes