2010-01-12 7 views
1

Sur notre serveur de fichiers Linux (RedHat Enterprise), nous avons des dossiers que nous devons renommer pour que le client y travaille. L'ancien format de dossier (ceux qui doivent être modifiés) était clientcode_jobnumberjobname. Le nouveau format est clientcode_jobnumber_jobname. Nous avons fondamentalement besoin de changer les anciens noms de dossiers en ajoutant le trait de soulignement supplémentaire au nom de fichier entre le jobnumber et jobname. Nous avons également toutes les nouvelles structures de dossiers qui sont créées pour afficher dans le nouveau format, il ne sera donc pas nécessaire de les modifier. Le numéro de travail est toujours 1 lettre suivi de 4 chiffres. Le code client est de 3-4 lettres selon le client. Le nom du travail est différent pour chaque travail. Les dossiers sont tous situés au clients/clientname/jobs/clientcode/"folder that needs to be renamed" (juste un exemple de la profondeur du script dans la structure). Il devra faire cela pour chaque clientcode sous chaque client. Comment pourrais-je configurer un script pour le faire? Toute aide serait grandement appréciée. Nous avons des milliers de dossiers que nous devons renommer.bash Linux - Renommer le dossier Massive

Répondre

7

Il existe quelques commandes qui agissent comme sed sur les noms de fichiers; essayez mmv (ou la variante perl de rename, alias prename ou rename.PL, que vous ne trouverez peut-être pas sur RHEL). En bonus, les deux ont une option -n (pas d'action), donc vous pouvez vérifier ce que vous allez faire ne va pas faire des choses ou perdre de l'information.

+0

+1 pour résister au désir de le coder. –

+0

Le renommer RH est différent du renommer Debian, et ne fonctionnera pas ici. –

+0

Il est parfois appelé 'prename'. –

0
for entry in * ; do 
    if [ ! -d "$entry" ] ; then 
    continue 
    fi 
    jobname="${entry##*_?????}" 
    dirbase="${entry%$jobname}" 
    if [ -z "$dirbase" -o -z "$jobname" ] ; then 
    echo "Error with '$entry'" 
    continue 
    fi 
    mv "$entry" "${dirbase}_$jobname" 
done 
0

peut-être juste moi, mais je ne comprends tout à fait exactement comment la structure du répertoire ressemble, pourriez-vous s'il vous plaît donner un exemple dans les quelques balises de code.

Et peut-être cela devrait être sur serverfault.com (mais je suppose un #/script bin/sh compte que la programmation!)

EDIT: Noufal Ibrahim, résistant? Il s'agit d'utiliser un moyen qui fonctionne avec toutes les versions compatibles POSIX, ou Linux, peut-être im vieux, mais les machines Solaris que je n'ai pas incluent rename ou mmv. Par conséquent, une telle solution n'est pas possible.

0

puisque vous dites que le format de nom est très structuré et tout est sous un seul parent (soit comme children..not direct ou indirect que de ce que vous avez mentionné), je suggère ceci:

Créer régulièrement expression pour le nom du dossier et écrire un petit script Perl qui correspondrait au nom du contenu du dossier cible (sous lequel vous avez les dossiers à renommer) par rapport à l'expression régulière. une fois que vous avez les correspondances, renommez le dossier pour le nouveau nom. Perl rend tout cela facile. Si vous décidez de poursuivre cette approche et juste au cas où vous ne connaissez pas Perl et que vous vous demandez par où commencer et si vous êtes intéressé à faire un peu d'apprentissage en cours de route, je vous suggère de lire le livre. Minimal Perl "... une façon rapide et intéressante d'apprendre le langage monstrueux et de l'utiliser pour des choses semblables à ce dont vous avez besoin maintenant.

Espérons que cela aide.

0
find /path/clients -type d -name "*_?[0-9][0-9][0-9][0-9]*" | while IFS= read -r DIR 
do 
    dir=${DIR##*/} 
    base=${DIR%/*} 
    IFS="_" 
    set -- $dir 
    front=$1 
    back=$2 
    jobname=${back#?????} 
    jobnum=${back%$jobname} 
    newname="${front}_${jobnum}_${jobname}" 
    echo mv "$DIR" "$base/$newname" 
done 
Questions connexes