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

Вы можете создавать жесткие ссылки.

У жестких ссылок есть свои собственные недостатки, например, нет ссылок на каталоги, нет ссылок на файловые системы. И они не удаляются при удалении «оригинала»; Фактически, они препятствуют освобождению пространства на диске, и вы все равно можете получить доступ к контенту через жесткую ссылку.

Вы не можете создавать жесткие ссылки в файловом браузере (Nautilus), но есть отчет об ошибке об этом.

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

12 ответов

С помощью 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, чтобы это сделать).

2
ответ дан 22 May 2018 в 21:45
  • 1
    Привет, я новичок в ubuntu. Имя моего каталога - это тест. Он содержит много файлов, таких как 2.01149, 2.35698 и т. Д. Могу ли я попросить вас объяснить, как выполнить ваши предложения в командной строке, немного ясно. – vidyadhar 8 June 2017 в 17:54
  • 2
    Спасибо. Это действительно помогло мне, когда «-n» не используется. Извините за предыдущий комментарий, я сделал глупую ошибку при использовании вашего предложения. – vidyadhar 8 June 2017 в 19:13

С помощью 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, чтобы это сделать).

2
ответ дан 18 July 2018 в 11:58

С помощью 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, чтобы это сделать).

2
ответ дан 24 July 2018 в 19:53

Есть, вероятно, другие способы сделать это, но 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
ответ дан 22 May 2018 в 21:45
  • 1
    Привет, я новичок в ubuntu. Имя моего каталога - это тест. Он содержит много файлов, таких как 2.01149, 2.35698 и т. Д. Могу ли я попросить вас объяснить, как выполнить ваши предложения в командной строке, немного ясно. – vidyadhar 8 June 2017 в 17:54
  • 2
    Привет, я мог бы выработать то, что вы предложили. Но у меня так много файлов. Как выбрать все из них, как указано в первой строке $ touch 2.01149, 2.1149 2.35698 2.545 2.95874566 – vidyadhar 8 June 2017 в 19:09
  • 3
    @vidyadhar - Отредактировано, чтобы объяснить более четко. Вам не нужно запускать строку touch, которая должна была просто создавать фиктивные файлы для демонстрации; извините, что было неясно. Команда perl -E... является единственной, которую вы действительно должны запускать. – Dave Sherohman 9 June 2017 в 10:30

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

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

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

Обратите внимание, что это только обрезает имена файлов. Если вы хотите округлить, вам понадобится больше работы.

0
ответ дан 22 May 2018 в 21:45
  • 1
    Привет, я новичок в ubuntu. Имя моего каталога - это тест. Он содержит много файлов, таких как 2.01149, 2.35698 и т. Д. Могу ли я попросить вас объяснить, как выполнить ваши предложения в командной строке, немного ясно. – vidyadhar 8 June 2017 в 17:55
  • 2
    Тот же ответ, что и Сергей. cd test, тогда скопируйте и вставьте именно команду, которую я дал. – Joe P 8 June 2017 в 18:06
  • 3
    В консольных окнах вам может понадобиться Ctrl-Shift-V для вставки или использования меню. – Joe P 8 June 2017 в 18:07

find + 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

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

bash для цикла и 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
ответ дан 22 May 2018 в 21:45
  • 1
    Привет, я новичок в ubuntu. Имя моего каталога - это тест. Он содержит много файлов, таких как 2.01149, 2.35698 и т. Д. Могу ли я попросить вас объяснить, как выполнить ваши предложения в командной строке, немного ясно. – vidyadhar 8 June 2017 в 18:00
  • 2
    @vidyadhar просто cd в каталог и введите команды. Больше нечего делать – Sergiy Kolodyazhnyy 8 June 2017 в 18:04

Есть, вероятно, другие способы сделать это, но 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
ответ дан 18 July 2018 в 11:58

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

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

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

Обратите внимание, что это только обрезает имена файлов. Если вы хотите округлить, вам понадобится больше работы.

0
ответ дан 18 July 2018 в 11:58

find + 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

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

bash для цикла и 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
ответ дан 18 July 2018 в 11:58

Есть, вероятно, другие способы сделать это, но 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
ответ дан 24 July 2018 в 19:53
  • 1
    Привет, я новичок в ubuntu. Имя моего каталога - это тест. Он содержит много файлов, таких как 2.01149, 2.35698 и т. Д. Могу ли я попросить вас объяснить, как выполнить ваши предложения в командной строке, немного ясно. – vidyadhar 8 June 2017 в 17:54
  • 2
    Привет, я мог бы выработать то, что вы предложили. Но у меня так много файлов. Как выбрать все из них, как указано в первой строке $ touch 2.01149, 2.1149 2.35698 2.545 2.95874566 – vidyadhar 8 June 2017 в 19:09
  • 3
    @vidyadhar - Отредактировано, чтобы объяснить более четко. Вам не нужно запускать строку touch, которая должна была просто создавать фиктивные файлы для демонстрации; извините, что было неясно. Команда perl -E... является единственной, которую вы действительно должны запускать. – Dave Sherohman 9 June 2017 в 10:30

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

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

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

Обратите внимание, что это только обрезает имена файлов. Если вы хотите округлить, вам понадобится больше работы.

0
ответ дан 24 July 2018 в 19:53
  • 1
    Привет, я новичок в ubuntu. Имя моего каталога - это тест. Он содержит много файлов, таких как 2.01149, 2.35698 и т. Д. Могу ли я попросить вас объяснить, как выполнить ваши предложения в командной строке, немного ясно. – vidyadhar 8 June 2017 в 17:55
  • 2
    Тот же ответ, что и Сергей. cd test, тогда скопируйте и вставьте именно команду, которую я дал. – Joe P 8 June 2017 в 18:06
  • 3
    В консольных окнах вам может понадобиться Ctrl-Shift-V для вставки или использования меню. – Joe P 8 June 2017 в 18:07

find + 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

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

bash для цикла и 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
ответ дан 24 July 2018 в 19:53
  • 1
    Привет, я новичок в ubuntu. Имя моего каталога - это тест. Он содержит много файлов, таких как 2.01149, 2.35698 и т. Д. Могу ли я попросить вас объяснить, как выполнить ваши предложения в командной строке, немного ясно. – vidyadhar 8 June 2017 в 18:00
  • 2
    @vidyadhar просто cd в каталог и введите команды. Больше нечего делать – Sergiy Kolodyazhnyy 8 June 2017 в 18:04

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

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