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

4

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 tels que 2.01149, 2.1149, 2.35698, 2.545, 2.95874566 ..... et beaucoup d’autres , etc.

Je souhaite que les fichiers de temps ne comportent que 4 chiffres après le signe décimal ou que les noms de fichiers soient arrondis au nombre entier le plus proche, tels que 2.0115, 2.1149, 2.3670, 2.5450, 2.9588, etc. Quelqu'un peut-il m'aider comment faire cela?

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 ci-dessus

Bonjour, la commande prename -n 's/\d\.\d+/sprintf "%.4f", $&/e' *([0-9.]) a aidé à renommer mes fichiers horaires.

Mais, je fais face à une erreur en essayant d’ouvrir Paraview.

Le terminal indique: 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 remédier à cela?

    
posée vidyadhar 08.06.2017 - 16:25
la source

4 réponses

2

Avec prename à base de 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

(supprimez 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

(supprimez le echo pour le faire réellement).

    
réponse donnée steeldriver 08.06.2017 - 16:35
la source
2

Il existe probablement d'autres moyens de le faire, mais Perl est celui qui me convient le plus facilement. Pour ce faire, accédez au 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 qu'en utilisant touch pour créer des fichiers portant les noms spécifiés dans la question, il 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
    
réponse donnée Dave Sherohman 08.06.2017 - 16:34
la source
0

Si vous avez l'exécutable Perl rename , cela fonctionnera:

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 seul tronque les noms de fichiers. Si vous voulez arrondir, il vous faudra plus de travail.

    
réponse donnée Joe P 08.06.2017 - 16:38
la source
0

rechercher + tandis que + printf

bash-4.3$ find -type f -name "[1-9].[1-9]*" -printf "%P
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
" | 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 réellement

bash pour les boucles et printf ':

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

Remplacez echo par mv et supprimez "->" part pour le remplacement effectif.

Python

bash-4.3$ find -type f -name "[1-9].[1-9]*" -printf "%P
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
" | 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
    
réponse donnée Sergiy Kolodyazhnyy 08.06.2017 - 16:56
la source

Lire d'autres questions sur les étiquettes