С Новым годом! Форум программистов, компьютерный форум, киберфорум
Shell, Bash
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.83/18: Рейтинг темы: голосов - 18, средняя оценка - 4.83
0 / 0 / 0
Регистрация: 19.06.2017
Сообщений: 7

Групповое переименование файлов

19.06.2017, 12:19. Показов 3364. Ответов 9

Студворк — интернет-сервис помощи студентам
Здравствуйте!

Есть прозвольное множество файлов вида:
№ 444-П от 28.11.2014 О внесении изменений в № 22-п от 23.01.13.doc
№ 4-Р от 28.11.2014 О внесении изменений в № 22-р от 23.01.13.docx
№ 2-П от 18.11.2016 Оваприарпарпаррв № 22-п от 13.01.13.doc

Их нужно переименовать в файлы вида:
444-p_28.11.14.doc
4-r_28.11.14.docx
2-p_18.11.16.doc

Т.е. (порядок слева-направо)
1) на входе произвольное количество произвольных символов до первой цифры удаляется
2) после цифр (от одной до четырех, т.е 1,2,3,...29,28,...1294,9999) и символа — удаляется все символы снова до первой цифры.
3) если после символа - была буква П (кириллица), то она заменяется на p (латиница). Если после символа - была буква Р (кириллица), то она заменяется на r (латиница). После замены добавляется символ _.
4) сокращение даты, если она имеет вид дд.мм.гггг в дд.мм.гг.
5) удаление всех символов (включая пробелы) до расширения.

Есть идеи, как реализовать?
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
19.06.2017, 12:19
Ответы с готовыми решениями:

Вытащить файлы из группы вложенных папок. Групповое переименование
Есть папка(назовем ее А). В ней - группа других папок(назовем их В). В этих вложенных папках тоже возможно наличие папок. Задача - все...

Переименование файлов.
Здравствуйте! Есть задача: во всех подкаталогах указанного в качестве параметра каталога (и в нем самом) переименовать все файлы в...

Переименование файлов
Доброй ночи. Задача: Есть каталог и несколько уровней подкаталогов, в "последнем" каталоге лежит 1 файл, необходимо переименовать...

9
Эксперт NIX
 Аватар для Marinero
2796 / 2039 / 682
Регистрация: 02.03.2015
Сообщений: 6,509
19.06.2017, 22:38
prename за идею пройдет?
0
0 / 0 / 0
Регистрация: 19.06.2017
Сообщений: 7
20.06.2017, 08:18  [ТС]
На счет prename сомневаюсь, что он сможет такое сложное переименование

Вот накостылил скрипт:

Bash
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
[SPOILER]#!/bin/bash
shopt -s nullglob
for NAME in * ; do
 TRS=`echo $NAME | sed "y///"`
 TRS=`echo $TRS | sed "y///"`
 TRS=${TRS//№/}
 TRS=${TRS// /}
 TRS=${TRS//../.}
 TRS=${TRS//П/p}
 TRS=${TRS//Р/r}
 TRS=${TRS//п/p}
 TRS=${TRS//р/r}
 
 TRS=${TRS//й/}
 TRS=${TRS//ц/}
 TRS=${TRS//у/}
 TRS=${TRS//к/}
 TRS=${TRS//е/}
 TRS=${TRS//н/}
 TRS=${TRS//г/}
 TRS=${TRS//ш/}
 TRS=${TRS//щ/}
 TRS=${TRS//з/}
 TRS=${TRS//х/}
 TRS=${TRS//ъ/}
 TRS=${TRS//ф/}
 TRS=${TRS//ы/}
 TRS=${TRS//в/}
 TRS=${TRS//а/}
 TRS=${TRS//о/}
 TRS=${TRS//л/}
 TRS=${TRS//д/}
 TRS=${TRS//ж/}
 TRS=${TRS//э/}
 TRS=${TRS//я/}
 TRS=${TRS//ч/}
 TRS=${TRS//с/}
 TRS=${TRS//м/}
 TRS=${TRS//и/}
 TRS=${TRS//т/}
 TRS=${TRS//ь/}
 TRS=${TRS//б/}
 TRS=${TRS//ю/}
 
 TRS=${TRS//Й/}
 TRS=${TRS//Ц/}
 TRS=${TRS//У/}
 TRS=${TRS//К/}
 TRS=${TRS//Е/}
 TRS=${TRS//Н/}
 TRS=${TRS//Г/}
 TRS=${TRS//Ш/}
 TRS=${TRS//Щ/}
 TRS=${TRS//З/}
 TRS=${TRS//Х/}
 TRS=${TRS//Ъ/}
 TRS=${TRS//Ф/}
 TRS=${TRS//Ы/}
 TRS=${TRS//В/}
 TRS=${TRS//А/}
 TRS=${TRS//О/}
 TRS=${TRS//Л/}
 TRS=${TRS//Д/}
 TRS=${TRS//Ж/}
 TRS=${TRS//Э/}
 TRS=${TRS//Я/}
 TRS=${TRS//Ч/}
 TRS=${TRS//С/}
 TRS=${TRS//М/}
 TRS=${TRS//И/}
 TRS=${TRS//Т/}
 TRS=${TRS//Ь/}
 TRS=${TRS//Б/}
 TRS=${TRS//Ю/}
 
 TRS=${TRS//p/p_}
 TRS=${TRS//r/r_}
 
 TRS=${TRS//(/}
 TRS=${TRS//)/}
 TRS=${TRS//__/}
 TRS=${TRS//.201/.1}
 
 mv -v "$NAME" "$TRS"
 if [[ `file -b "$TRS"` == directory ]]; then
 cd "$TRS"
 "$0"
 cd ..
 fi
done[/SPOILER]
Переименовывает почти как нужно, получились файлы вида:
64-p_22.02.17.r_r_p_p_r_-.doc
366-p_27.02.17.r_p_r_p_r_p_.doc
1267-p_27.02.17.p_25.10.16.461-p_.doc

Осталось только убрать символы после второй точки и двух цифр до расширения, чтобы получилось:
64-p_22.02.17.doc
366-p_27.02.17.doc
1267-p_27.02.17.doc

Пока думаю, как сделать
0
Эксперт NIX
 Аватар для nezabudka
3334 / 752 / 252
Регистрация: 28.06.2015
Сообщений: 1,552
Записей в блоге: 16
20.06.2017, 16:09
Лучший ответ Сообщение было отмечено Ronald73789 как решение

Решение

Bash
1
2
3
4
5
6
7
8
#!/usr/bin/env bash
ls | grep '№ [0-9]\+-Р' | while read d; do
 mv "$d" $(sed -n 's/^№ \([0-9]\+\-\)Р.\{4\}\([0-9]\{1,2\}\.[0-9]\{2\}\)\...\([0-9]\{2\}\).*\(\.doc.\?\)$/\1p_\2\.\3\4/p' <<<"$d")
done
 
ls | grep '№ [0-9]\+-П' | while read d; do
 mv "$d" $(sed -n 's/^№ \([0-9]\+\-\)П.\{4\}\([0-9]\{1,2\}\.[0-9]\{2\}\)\...\([0-9]\{2\}\).*\(\.doc.\?\)$/\1p_\2\.\3\4/p' <<<"$d")
done
Добавлено через 11 минут
Небольшое исправление:
Bash
1
2
3
4
5
6
7
8
#!/usr/bin/env bash
ls | grep '№ [0-9]\+-Р' | while read d; do
mv "$d" $(sed -n 's/^№ \([0-9]\+\-\)Р.\{4\}\([0-9]\{1,2\}\.[0-9]\{2\}\)\...\([0-9]\{2\}\).*\(\.doc.\?\)$/\1r_\2\.\3\4/p' <<<"$d")
done
 
ls | grep '№ [0-9]\+-П' | while read d; do
mv "$d" $(sed -n 's/^№ \([0-9]\+\-\)П.\{4\}\([0-9]\{1,2\}\.[0-9]\{2\}\)\...\([0-9]\{2\}\).*\(\.doc.\?\)$/\1p_\2\.\3\4/p' <<<"$d")
done
1
0 / 0 / 0
Регистрация: 19.06.2017
Сообщений: 7
21.06.2017, 08:09  [ТС]
nezabudka, спасибо, работает!

Переименовывает файлы вида (№ 75-П от 01.03.2017 г. О внесении изменений в постановление от 30.03.2011 г. № 118-П.doc) как надо. Осталась маленькая проблемка - файлы вида (№ 83 - П от 03.03.2017 г. О внесении изменений в постановление от 25.10.2016 г. № 461-П.doc)не переименовывает, у них в названии пробелы около тире, если их убрать вручную, то скрипт и на них срабатывает.

Пробовал добавить пробелы в код, но чего-то не хочет работать:

Bash
1
2
3
4
5
6
7
8
#!/usr/bin/env bash
ls | grep '№ [0-9]\+-Р' | while read d; do
mv "$d" $(sed -n 's/^№ \([0-9]\+\ - \)Р.\{4\}\([0-9]\{1,2\}\.[0-9]\{2\}\)\...\([0-9]\{2\}\).*\(\.doc.\?\)$/\1r_\2\.\3\4/p' <<<"$d")
done
 
ls | grep '№ [0-9]\+-П' | while read d; do
mv "$d" $(sed -n 's/^№ \([0-9]\+\ - \)П.\{4\}\([0-9]\{1,2\}\.[0-9]\{2\}\)\...\([0-9]\{2\}\).*\(\.doc.\?\)$/\1p_\2\.\3\4/p' <<<"$d")
done
Может не туда добавляю?

Добавлено через 1 час 19 минут
Добавил часть своего костыля, теперь все работает:

Bash
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#!/usr/bin/env bash
shopt -s nullglob
for NAME in * ; do
 TRS=`echo $NAME | sed "y///"`
 TRS=`echo $TRS | sed "y///"`
 TRS=${TRS// - /-}
 mv -v "$NAME" "$TRS"
 if [[ `file -b "$TRS"` == directory ]]; then
 cd "$TRS"
 "$0"
 cd ..
 fi
done
 
ls | grep '№ [0-9]\+-Р' | while read d; do
mv "$d" $(sed -n 's/^№ \([0-9]\+\-\)Р.\{4\}\([0-9]\{1,2\}\.[0-9]\{2\}\)\...\([0-9]\{2\}\).*\(\.doc.\?\)$/\1r_\2\.\3\4/p' <<<"$d")
done
 
ls | grep '№ [0-9]\+-П' | while read d; do
mv "$d" $(sed -n 's/^№ \([0-9]\+\-\)П.\{4\}\([0-9]\{1,2\}\.[0-9]\{2\}\)\...\([0-9]\{2\}\).*\(\.doc.\?\)$/\1p_\2\.\3\4/p' <<<"$d")
done
Наверняка там много лишнего (в моем костыле), но тем не менее все работает.
0
Эксперт NIX
 Аватар для nezabudka
3334 / 752 / 252
Регистрация: 28.06.2015
Сообщений: 1,552
Записей в блоге: 16
22.06.2017, 10:25
Лучший ответ Сообщение было отмечено Ronald73789 как решение

Решение

Возможные пробелы надо обозначить в четырех шаблонах как [ \?] и немного изменить код
Bash
1
2
3
4
5
6
7
8
#!/usr/bin/env bash
ls | grep '№ [0-9]\+ \?\- \?Р' | while read d; do
mv "$d" $(sed -n 's/^№ \([0-9]\+\) \?\- \?Р.\{4\}\([0-9]\{1,2\}\.[0-9]\{2\}\)\...\([0-9]\{2\}\).*\(\.doc.\?\)$/\1-r_\2\.\3\4/p' <<<"$d")
done
 
ls | grep '№ [0-9]\+ \?\- \?П' | while read d; do
mv "$d" $(sed -n 's/^№ \([0-9]\+\) \?\- \?П.\{4\}\([0-9]\{1,2\}\.[0-9]\{2\}\)\...\([0-9]\{2\}\).*\(\.doc.\?\)$/\1-p_\2\.\3\4/p' <<<"$d")
done
1
0 / 0 / 0
Регистрация: 19.06.2017
Сообщений: 7
22.06.2017, 10:44  [ТС]
nezabudka, еще раз спасибо!
Добавил регистронезависимости для "П" и "Р":

Bash
1
2
3
4
5
6
7
8
#!/usr/bin/env bash
ls | grep '№ [0-9]\+ \?\- \?[Рр]' | while read d; do
mv "$d" $(sed -n 's/^№ \([0-9]\+\) \?\- \?[Рр].\{4\}\([0-9]\{1,2\}\.[0-9]\{2\}\)\...\([0-9]\{2\}\).*\(\.doc.\?\)$/\1-r_\2\.\3\4/p' <<<"$d")
done
 
ls | grep '№ [0-9]\+ \?\- \?[Пп]' | while read d; do
mv "$d" $(sed -n 's/^№ \([0-9]\+\) \?\- \?[Пп].\{4\}\([0-9]\{1,2\}\.[0-9]\{2\}\)\...\([0-9]\{2\}\).*\(\.doc.\?\)$/\1-p_\2\.\3\4/p' <<<"$d")
done
0
Эксперт NIX
 Аватар для Marinero
2796 / 2039 / 682
Регистрация: 02.03.2015
Сообщений: 6,509
24.06.2017, 15:55
Цитата Сообщение от Ronald73789 Посмотреть сообщение
ls | grep '№ [0-9]\+ \?\- \?[Рр]'
Пора убивать за такие вещи… + два цикла с перебором файлов…
Code
1
2
prename -vn 's/.*? (\d+) ?- ?(\w+) \D*(\d\d\.\d\d\.)(\d\d){1,2}.*(\.\w+?)/$1-$2_$3$4$5/
             tr/\x9f\xbf\xa0\x80\xd0\xd1/pprr/d' *.doc*
1
Эксперт NIX
 Аватар для nezabudka
3334 / 752 / 252
Регистрация: 28.06.2015
Сообщений: 1,552
Записей в блоге: 16
27.06.2017, 09:29
Вопрос к перловодам, как заполучить команду prename ?
0
Эксперт NIX
 Аватар для Marinero
2796 / 2039 / 682
Регистрация: 02.03.2015
Сообщений: 6,509
27.06.2017, 12:29
nezabudka, она есть в комплекте самого perl'а и устанавливается как замена rename
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
27.06.2017, 12:29
Помогаю со студенческими работами здесь

Переименование файлов в цифры
Написал скрипт для замены имен файлов в каталоге на цифры 1,2,3 и т.д Не могу исправить один недочёт,если в имени файла есть пробелы или...

Проверка имен файлов и переименование
Добрый день. Помогите решить задачу с помощью батфайла Есть структура из определенного количества папок. Папка имеет название —...

Поиск и переименование файлов по заданным параметрам
1)Определить количество файлов или подкаталогов в корневом каталоге, к которым все имеют полные права доступа. 2)Написать скрипт, который...

Массовое переименование файлов
Доброго всем дня, подскажите пожалуйста как решить данный вопрос. Имеется raid раздел размером 6тб, на нем заполнено файлами и папками...

Как написать простенький скрипт (переименование файлов)
Имеем несколько папок в которых находится n-количество файлов. Не более 3х в одной папке с расширениями *.001 *.002 *.003. При...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Новые блоги и статьи
сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
Модель микоризы: классовый агентный подход 3
anaschu 06.01.2026
aa0a7f55b50dd51c5ec569d2d10c54f6/ O1rJuneU_ls https:/ / vkvideo. ru/ video-115721503_456239114
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR
ФедосеевПавел 06.01.2026
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR ВВЕДЕНИЕ Введу сокращения: аналоговый ПИД — ПИД регулятор с управляющим выходом в виде числа в диапазоне от 0% до. . .
Модель микоризы: классовый агентный подход 2
anaschu 06.01.2026
репозиторий https:/ / github. com/ shumilovas/ fungi ветка по-частям. коммит Create переделка под биомассу. txt вход sc, но sm считается внутри мицелия. кстати, обьем тоже должен там считаться. . . .
Расчёт токов в цепи постоянного тока
igorrr37 05.01.2026
/ * Дана цепь постоянного тока с сопротивлениями и источниками (напряжения, ЭДС и тока). Найти токи и напряжения во всех элементах. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа и. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru