LINUX.ORG.RU

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

 , ,


0

1

Здравствуйте!

Есть прозвольное множество файлов вида:

№ 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) удаление всех символов (включая пробелы) до расширения.

Есть идеи, как реализовать?

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

#!/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

Переименовывает почти как нужно, получились файлы вида:

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

Скрипт - костыль, может кто подскажет, как правильно?

Если все данные разные, но есть паттерн расположения, то лучше awk, а не это вот.

Bfgeshka ★★★★★
()

Хотите извращений - их есть у меня

$ for i in "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"; do echo $i | sed "p; s/\([^.]*\.[^.]*\.[0-9]\{2\}\).*\(\.[^.]*\)/\1\2/"; done
64-p_22.02.17.r_r_p_p_r_-.doc
64-p_22.02.17.doc
366-p_27.02.17.r_p_r_p_r_p_.doc
366-p_27.02.17.doc
1267-p_27.02.17.p_25.10.16.461-p_.doc
1267-p_27.02.17.doc
justAmoment ★★★★★
()

попробуй

TRS=${TRS//П/p}
TRS=${TRS//Р/r}

замени на
TRS=${TRS/П/p}
TRS=${TRS/Р/r}

bl ★★★
()

Всем спасибо, проблема решена этим скриптом:

#!/usr/bin/env bash
shopt -s nullglob
for NAME in * ; do
 TRS=`echo $NAME`
 TRS=`echo $TRS`
 TRS=${TRS// - /-}
 TRS=${TRS//- /-}
 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.\?\)$/\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.\?\)$/\1r_\2\.\3\4/p' <<<"$d")
done
Ronald73789
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.