Любая команда для изменения имен файлов только с 4 цифрами после десятичной точки или округленный - прочь к ближайшему целому числу

У меня есть каталог, названный "тестом", содержащим файлы данных, сохраненные во время моделирования в разное время. Названия файлов похожи 2.01149, 2.1149, 2.35698, 2.545, 2.95874566..... и намного больше и т.д.

Я хочу иметь файлы времени только с 4 цифрами после десятичной точки, или я хотел бы округлить имена файлов - прочь к ближайшему целому числу такой как 2,0115, 2.1149, 2.3670, 2.5450, 2.9588... и т.д. Кто-либо может помочь мне, как сделать это?

Я плохо знаком с человечностью. Позвольте мне запросить кого-либо объяснить, как выполниться на командной строке, немного ясно как то, где сохранить имя каталога и т.д. Спасибо за понимание!!!

Запрос после получения решения вышеупомянутого

Привет, команда prename -n 's/\d\.\d+/sprintf "%.4f", $&/e' *([0-9.]) помогший переименовать мои файлы времени.

Но, я сталкиваюсь с ошибкой при попытке открыть парапредставление.

Терминал говорит: ПЕНА, Предупреждающая:

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.   

После открытия парапредставления, некоторых значений полей как вихрение, не отображены Lambda2.

Как исправить это?

4
задан 14 June 2017 в 09:37

4 ответа

С находящимся в perl prename и расширенный шарик для выбора файлов:

$ 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 после того как Вы удовлетворены, что это делает правильную вещь).

Или - эквивалентно - с ударом builtins и 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
ответ дан 1 December 2019 в 09:45

Если у Вас будет исполняемый файл Perl rename, то это сделает это:

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

Удаляют -n, после того как Вы проверили, что это делает то, что Вы хотите.

Примечание это только усекают имена файлов. Если бы Вы хотите окружить, больше работы было бы необходимо.

0
ответ дан 1 December 2019 в 09:45

Существуют, вероятно, другие способы сделать это, но 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
2
ответ дан 1 December 2019 в 09:45

найдите + в то время как + 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

Замена echo с mv для фактического переименования


удар для цикла и 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

Эхо замены с 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
0
ответ дан 1 December 2019 в 09:45

Другие вопросы по тегам:

Похожие вопросы: