J'ai un répertoire nommé "test" contenant des fichiers de données sauvegardés lors d'une simulation à des moments différents. Les noms des fichiers sont comme 2.01149, 2.1149, 2.35698, 2.545, 2.95874566 ..... et beaucoup d’autres etc.
Je veux avoir les fichiers de temps avec seulement 4 chiffres après le signe décimal ou j'aimerais que les noms de fichiers soient arrondis au nombre entier le plus proche tel que 2.0115, 2.1149, 2.3670, 2.5450, 2.9588, etc. Peut-on aider moi comment faire ça?
Je suis nouveau à Ubuntu. Puis-je demander à n'importe qui d'expliquer comment exécuter en ligne de commande, un peu clairement comme où conserver le nom du répertoire, etc. Merci de votre compréhension !!!
Requête après avoir obtenu la solution à ce qui précède
Bonjour, la commande prename -n 's/\d\.\d+/sprintf "%.4f", $&/e' *([0-9.])
m'a aidé à renommer mes fichiers de temps.
Mais, je fais face à une erreur en essayant d'ouvrir Paraview.
Le terminal dit: FOAM Avertissement:
From function void Foam::Time::setControls()
in file db/Time/Time.C at line 307
Reading "/Re600/2.498/uniform/time" from line 15 to line 23
Time read from time dictionary 2.497956694 differs from actual time 2.498.
This may cause unexpected database behaviour. If you are not interested in preserving time state delete the time dictionary.
Après avoir ouvert la vue partielle, certaines valeurs de champ telles que vorticity, Lambda2 ne sont pas affichées.
Comment rectifier cela?
Avec prename
basé sur Perl et un glob étendu pour sélectionner les fichiers:
$ prename -n 's/\d\.\d+/sprintf "%.4f", $&/e' *([0-9.])
2.01149 renamed as 2.0115
2.35698 renamed as 2.3570
2.545 renamed as 2.5450
2.95874566 renamed as 2.9587
(Enlevez le -n
une fois que vous êtes convaincu qu’il fait la bonne chose).
Ou - de manière équivalente - avec les commandes internes bash et mv
$ for f in *([0-9.]); do printf -v g '%.4f' "$f"; echo mv -- "$f" "$g"; done
mv -- 2.01149 2.0115
mv -- 2.1149 2.1149
mv -- 2.35698 2.3570
mv -- 2.545 2.5450
mv -- 2.95874566 2.9587
(retirez la echo
pour le faire).
Il y a probablement d'autres façons de le faire, mais Perl est celui qui me vient le plus facilement. Pour ce faire, allez dans le répertoire où se trouvent les fichiers et exécutez la commande Perl -E 'rename $_, sprintf(q(%0.4f), $_) for @ARGV' *
.
L'exemple suivant montre comment, en utilisant touch
pour créer des fichiers avec les noms spécifiés dans la question, exécute la commande pour les renommer, puis utilise ls
pour indiquer qu'ils ont été renommés de la manière spécifiée:
$ touch 2.01149, 2.1149 2.35698 2.545 2.95874566
$ Perl -E 'rename $_, sprintf(q(%0.4f), $_) for @ARGV' *
$ ls
2.0115 2.1149 2.3570 2.5450 2.9587
Si vous avez l'exécutable Perl rename
, cela le fera:
rename -n 's/(\d+\.\d{4})\d*/$1/' *
Supprimez le -n
une fois que vous avez vérifié qu'il fait ce que vous voulez.
Notez que seulement tronque les noms de fichiers. Si vous voulez arrondir, il vous faudra plus de travail.
bash-4.3$ find -type f -name "[1-9].[1-9]*" -printf "%P\0" | while IFS= read -r -d '' file; do echo "$file" "$(printf "%.4f" "$file")"; done
2.1149 2.1149
2.35698 2.3570
2.545 2.5450
2.95874566 2.9587
Remplacez echo
par mv
pour renommer
bash-4.3$ for f in *;do new=$(printf "%.4f" "$f"); echo "$f" "->" "$new"; done
2.01149 -> 2.0115
2.1149 -> 2.1149
2.35698 -> 2.3570
2.545 -> 2.5450
2.95874566 -> 2.9587
Remplacez l'écho par mv
et retirez la partie "->"
pour son remplacement effectif.
bash-4.3$ ls
2.01149 2.1149 2.35698 2.545 2.95874566
bash-4.3$ python -c 'import sys,os;f=map(lambda x: (x,"%.4f" % float(x)),sys.argv[1:]);[os.rename(i[0],i[1]) for i in f]' *
bash-4.3$ ls
2.0115 2.1149 2.3570 2.5450 2.9587