web-dev-qa-db-fra.com

Toute commande permettant de modifier les noms de fichier avec seulement 4 chiffres après le signe décimal ou arrondi au nombre entier le plus proche

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?

4
vidyadhar

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).

2
steeldriver

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
2
Dave Sherohman

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.

0
Joe P

find + while + printf

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 pour loop et printf`:

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.


Python

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
0