web-dev-qa-db-fra.com

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

Nous avons un certain nombre de rapports de travail d'un système qui enregistrent sur notre serveur Linux le préfixe O*****.TXT. L'identifiant de processus du rapport se trouve dans le fichier.

Quel script puis-je exécuter pour rechercher tous les fichiers 'O****.TXT d'un répertoire et renommer chaque fichier avec l'ID de processus de chaque fichier? par exemple:

Recherchez OAAJWNZN.TXT pour ProcID:0000019324, renommez OAAJWNZN.TXT en 0000019324.TXT.

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

7
IanG

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

Puisque la ligne ProcID est en fait:

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

Pour extraire le I, P, nous devons séparer : et ), ce qui nous donnera 0000019324 comme deuxième champ.

Supprimez echo pour exécuter le déplacement. Utilisez cette option uniquement si les noms de fichier et ProcID ne contiennent pas d'espaces ni de caractères spéciaux.

Cette commande obtient la ProcID en la scindant 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 la méthode printf ... | "/bin/sh". Ensuite, nous passons au fichier suivant.

7
muru

Vous pouvez utiliser for, rename et 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

Supprimez -n après rename après le test pour renommer les fichiers.

Explication

  • for i in O*TXT; do faire quelque chose avec tous les fichiers correspondants
  • rename -n signalez simplement quels seront les nouveaux noms, ne les renommez pas encore (supprimez -n après les tests)
  • "s/old/new/" remplace old par new (utilisez des guillemets doubles au lieu de guillemets simples afin de pouvoir passer des variables avec $ expansion)
  • $(command) substitution de commande - passe la sortie de command à autre chose
  • .*\.TXT correspond à tous les caractères suivis du littéral . puis de TXT
  • sed invoque notre ami sed pour lire le fichier et en extraire des éléments
  • -n n'imprime rien jusqu'à ce que nous le demandions
  • -r utilise ERE pour ne pas avoir à échapper à () ou +
  • ( |^) espace ou début de ligne
  • ProcID:([0-9]+) au moins un chiffre après ProcID ... enregistrez le numéro pour plus tard
  • ( |$) espace ou fin de ligne
  • \2 référence du motif enregistré précédemment avec ()
  • p imprimer le résultat après édition
6
Zanna
  1. Boucle à travers les fichiers.
  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 de 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
4
pLumo