任何命令都可以更改小数点后只有 4 位数字的文件名或四舍五入为最接近的整数

任何命令都可以更改小数点后只有 4 位数字的文件名或四舍五入为最接近的整数

我有一个名为“test”的目录,其中包含在不同时间模拟期间保存的数据文件。文件的名称类似于 2.01149、2.1149、2.35698、2.545、2.95874566.....还有很多ETC。

我想要时间文件的小数点后只有 4 位数字,或者我希望文件名四舍五入为最接近的整数,例如 2.0115、2.1149、2.3670、2.5450、2.9588……等等。有人可以帮我吗?

我是 ubuntu 新手。请问有人能解释一下如何在命令行上执行,更清楚地说明一下目录名保存在哪里等。谢谢您的理解!!!

获得上述解决方案后的查询

您好,该命令prename -n 's/\d\.\d+/sprintf "%.4f", $&/e' *([0-9.])帮助我重命名时间文件。

但是,我在尝试打开 paraview 时遇到错误。

终端显示:泡沫警告:

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.   

打开 paraview 后,一些字段值(如涡度、Lambda2)没有显示。

如何纠正这个问题?

答案1

使用基于 perlprename和扩展的 glob 来选择文件:

$ 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

-n一旦您确认它正在做正确的事情,就将其删除)。

或者 - 等效地 - 使用 bash 内置命令和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

(删除echo即可实际执行)。

答案2

可能还有其他方法可以做到这一点,但 Perl 对我来说是最容易的。为此,请进入文件所在的目录并运行命令perl -E 'rename $_, sprintf(q(%0.4f), $_) for @ARGV' *

下面的示例通过使用touch创建具有问题中指定的名称的文件,运行命令重命名它们,然后使用ls显示它们已按指定名称重命名:

$ 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

答案3

如果你有 Perlrename可执行文件,那么可以这样做:

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

-n一旦确认它可以满足您的要求,就将其删除。

仅注意这一点截断文件名。如果要四舍五入,则需要做更多工作。

答案4

查找 + 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

替换echomv实际重命名


bash for 循环和 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

用 echo 替换mv并删除"->"部分以进行实际替换。


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

相关内容