Qualquer comando para alterar nomes de arquivos com apenas 4 dígitos após o ponto decimal ou arredondado para o inteiro mais próximo

4

Eu tenho um diretório chamado "teste" contendo arquivos de dados salvos durante uma simulação em momentos diferentes. Os nomes dos arquivos são como 2.01149, 2.1149, 2.35698, 2.545, 2.95874566 ..... e muito mais etc.

Eu quero ter os arquivos de tempo com apenas 4 dígitos após o ponto decimal ou gostaria de ter os nomes dos arquivos arredondados para o inteiro mais próximo, como 2.0115, 2.1149, 2.3670, 2.5450, 2.9588 ... etc. Alguém pode me ajudar como fazer isso?

Eu sou novo no Ubuntu. Posso pedir a alguém para explicar como executar na linha de comando, um pouco como onde manter o nome do diretório, etc. Obrigado pela compreensão!

Consulta após obter a solução para o acima

Olá, o comando prename -n 's/\d\.\d+/sprintf "%.4f", $&/e' *([0-9.]) ajudou a renomear meus arquivos de horário.

Mas, estou enfrentando um erro ao tentar abrir o paraview.

O terminal diz: Aviso de ESPUMA:

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.   

Após abrir a paraview, alguns valores de campo como vorticity, Lambda2, não são exibidos.

Como corrigir isso?

    
por vidyadhar 08.06.2017 / 16:25

4 respostas

2

Com prename baseado em perl e um glob estendido para selecionar os arquivos:

$ 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

(remova o -n quando tiver certeza de que está fazendo a coisa certa).

Ou - de forma equivalente - com bash builtins e 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

(remova o echo para realmente fazer isso).

    
por steeldriver 08.06.2017 / 16:35
2

Provavelmente, existem outras maneiras de fazê-lo, mas o Perl é o que mais me atinge. Para fazer isso, vá até o diretório onde os arquivos estão localizados e execute o comando perl -E 'rename $_, sprintf(q(%0.4f), $_) for @ARGV' * .

O exemplo a seguir demonstra, usando touch para criar arquivos com os nomes especificados na pergunta, executa o comando para renomeá-los e, em seguida, usa ls para mostrar que eles foram renomeados conforme especificado:

$ 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
    
por Dave Sherohman 08.06.2017 / 16:34
0

Se você tiver o executável Perl rename , isso será feito:

rename -n 's/(\d+\.\d{4})\d*/$1/' *

Remova o -n depois de confirmar que ele faz o que você deseja.

Note que apenas trunca os nomes dos arquivos. Se você quiser arredondar, mais trabalho seria necessário.

    
por Joe P 08.06.2017 / 16:38
0

encontrar + enquanto + 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

Substitua echo por mv para renomeação real

bash para loop e 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

Substitua o eco por mv e remova "->" da peça para a substituição real.

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
    
por Sergiy Kolodyazhnyy 08.06.2017 / 16:56