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.
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.
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.
for i in O*TXT; do
faire quelque chose avec tous les fichiers correspondantsrename -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 ligneProcID:([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 éditionFaites 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