2016-07-14 1 views
-1

Je suis en train d'écrire un script shell Unix qui trie des données dans dix sous-répertoires (nommés 1-10) du répertoire de base. Dans chaque sous-répertoire, le script doit renommer les fichiers hehd.output et fort.hehd.time, ainsi que copier le fichier hehd.data dans un fichier .data avec un nouveau nom.Attribution d'un nom à un fichier avec une variable dans un script shell

Ce que je voudrais que ce faire est de renommer chacun de ces fichiers dans le format suivant:

AA.BB.CC

AA = a variable in the hehd.data file within the subdirectory containing the file 
    BB = the name of the subdirectory containing the file (1-10) 
    CC = the original file name 

Chaque sous-répertoire contient un HEHD. fichier de données, et chaque fichier hehd.data contient la chaîne ij0 = AA, où AA représente la variable que je veux utiliser pour renommer les fichiers dans le même sous-répertoire.

Par exemple: Lors de l'exécution, le script doit rechercher /home/4/hehd.data pour la chaîne ij0 = 2, puis déplacez /home/4/hehd.output à /home/4/2.4.hehd .sortie.

J'utilise actuellement la commande grep pour que le script recherche la chaîne ij0 = * et la copie dans un nouveau fichier texte dans le sous-répertoire. Ensuite, la chaîne ij0 = est supprimée du fichier texte, puis son contenu est utilisé pour renommer tous les fichiers cibles dans le même sous-répertoire. La dernière ligne du script shell supprime le fichier texte.

Je suis à la recherche d'un meilleur moyen d'accomplir cela, de préférence de sorte que tous les dix sous-répertoires puissent être triés en même temps par le même script. Mon script semble incroyablement inefficace, et ne fait pas tout ce que je veux par lui-même.

Comment puis-je améliorer cela?

Tout conseil ou suggestion serait apprécié; J'essaie de devenir un meilleur utilisateur d'ordinateur et cela signifie apprendre de meilleures façons de faire les choses.

+1

Veuillez considérer fournir le code actuel, par opposition au pseudocode anglais seulement. Les détails de mise en œuvre sont importants, et nous ne pouvons pas voir ce qu'ils sont sans lire la mise en œuvre. –

+1

(En général, StackOverflow préfère les questions ciblées avec des réponses spécifiques, les questions ouvertes qui peuvent être interprétées comme «pouvons-nous discuter de X?» Ne sont pas les bienvenues ici, contrairement à la question de savoir comment puis-je résoudre le problème X? »qui a une solution concrète: pour des questions générales« comment puis-je améliorer ce code qui fonctionne déjà? », voir http: //codereview.stackexchange.com/- mais lisez plutôt les règles du site, plutôt que de simplement le repositionner). –

+1

... http://stackoverflow.com/help/dont-ask couvre un territoire similaire. –

Répondre

0

Essayez ceci:

fromdir=/home 
for i in {1..10};do 
    AA=$(sed 's/ij0=\([0-9]*\)/\1/' "$fromdir/$i/hehd.data") 
    BB="$i" 
    for f in "$fromdir/$i/"*;do 
    CC="${f##*/}" 
    if [[ "$CC" = "hehd.data" ]]; then 
     echo cp "$f" "$fromdir/$i/$AA.$BB.$CC" 
    else 
     echo mv "$f" "$fromdir/$i/$AA.$BB.$CC" 
    fi 
    done 
done 

Il boucle sur les répertoires en utilisant la séquence Bash {1..10].

Dans chaque répertoire, avec la commande sed, la valeur ij0 est affectée à la variable AA, le nom du répertoire est affecté à BB.

Dans la boucle de fichier, si le fichier est hehd.data, il est copié, sinon il est renommé avec le nouveau nom.

Vous pouvez supprimer les commandes echo avant cp et mv si la sortie répond à vos besoins.

+0

Sans l'OP affichant son code, vous pourriez vous retrouver avec le même code qu'il a déjà écrit. – alvits

+0

@alvits Il donne une brève description de son approche (créer un fichier à partir de la sortie 'grep', supprimer le nom de la variable du fichier, supprimer le fichier) qui n'est pas le mien. Laissez-nous attendre et voir. – SLePort