7 votes

Rechercher un texte dans un fichier, puis renommer le fichier avec ce texte

Nous disposons d'un certain nombre de rapports de travail provenant d'un système qui s'enregistre sur notre serveur Linux avec le préfixe O*****.TXT . Le fichier contient l'identifiant du processus du rapport.

Quel script puis-je exécuter pour rechercher toutes les 'O****.TXT dans un répertoire, et renommer chaque fichier avec l'identifiant du processus de chaque fichier ? Ex :

Recherche OAAJWNZN.TXT para ProcID:0000019324 , renommer OAAJWNZN.TXT a 0000019324.TXT .

Une fois ce fichier renommé, le script passe au fichier suivant dans le répertoire et fait de même.

7voto

muru Points 180007

Une commande awk qui lit le fichier et le renomme :

awk -F '[:)]' '/ProcID/{printf "echo mv %s %s.txt\n", FILENAME, $2 | "/bin/sh"; nextfile}' O*.TXT

Depuis l'entrée en vigueur de la ProcID est en fait :

JOB 04508907 (ProcID:0000019324) START AT 22.12.2016 / 09:10:45

Pour extraire l'I,P, nous devons séparer les deux : y ) , ce qui nous donnera 0000019324 comme deuxième champ.

Retirer echo pour exécuter le mouvement. N'utilisez cette option que si les noms de fichiers et les ProcID ne contiennent pas d'espaces ou de caractères spéciaux.

Cette commande permet d'obtenir le ProcID en se séparant sur : pour obtenir le deuxième champ, puis l'utilise avec la variable spéciale FILENAME pour construire la commande. Documentation de GNU awk suggère que le printf ... | "/bin/sh" méthode. Nous passons ensuite au fichier suivant.

6voto

Zanna Points 65764

Vous pouvez utiliser for , rename y sed dans le répertoire où se trouvent les fichiers :

for i in O*.TXT; do rename -n "s/.*\.TXT/$(sed -nr 's/.*( |^)ProcID:([0-9]+)( |$).*/\2/p' "$i").TXT/" "$i"; done

Retirer -n nach rename après avoir testé de renommer les fichiers

Explication

  • for i in O*TXT; do faire quelque chose avec tous les fichiers correspondants
  • rename -n se contente d'indiquer les nouveaux noms, sans les renommer pour l'instant (suppression de la fonction -n après les tests)
  • "s/old/new/" remplacer old con new (utiliser des guillemets doubles au lieu de simples pour pouvoir passer des variables avec $ l'expansion)
  • $(command) substitution de commande - transmettre la sortie de command à autre chose
  • .*\.TXT correspond à tous les caractères suivis d'une valeur littérale . et ensuite TXT
  • sed invoquer notre ami sed pour lire le fichier et en extraire des éléments
  • -n n'imprimez rien tant que nous ne l'avons pas demandé
  • -r utiliser l'ERE pour ne pas avoir à s'échapper () o +
  • ( |^) espace ou début de ligne
  • ProcID:([0-9]+) au moins un chiffre après ProcID... enregistrer le numéro pour plus tard
  • ( |$) espace ou fin de ligne
  • \2 référence au modèle sauvegardé précédemment avec ()
  • p imprimer le résultat de l'édition

4voto

pLumo Points 23269
  1. Passer en revue les fichiers en boucle.
  2. Vous pouvez utiliser grep pour trouver le ProcID
  3. Déplacer le fichier vers le nouveau nom de fichier

Faites un cp au lieu d'un mv si vous voulez conserver les anciens fichiers ou si vous n'êtes pas sûr.

for file in 0*.TXT; do
  procid=$(grep -Po "(?<=ProcID:)[0-9]*" "$file");
  new_filename="/outputpath/${procid}.TXT";
  if [ ! -f "$newfilename" ]; then
    mv "$file" "$new_filename";
  fi;
done

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X