У меня есть каталог, названный "тестом", содержащим файлы данных, сохраненные во время моделирования в разное время. Названия файлов похожи 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.
Как исправить это?
С находящимся в 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
на самом деле сделать это).
Если у Вас будет исполняемый файл Perl rename
, то это сделает это:
rename -n 's/(\d+\.\d{4})\d*/$1/' *
Удаляют -n
, после того как Вы проверили, что это делает то, что Вы хотите.
Примечание это только усекают имена файлов. Если бы Вы хотите окружить, больше работы было бы необходимо.
Существуют, вероятно, другие способы сделать это, но 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
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
для фактического переименования
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
и удалите "->"
часть для фактической замены.
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