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