У меня есть тысячи папок, как которые структурированы имена:
firstName_lastName_date
для которого я хочу подкачать две первых части с помощью подчеркивания _
как разделитель для окончания с:
lastName_firstName_date
lastName
может быть предшествоваться дворянской частицей, разделенной с дополнительным _
во входных папках.
Например:
firstName_de_lastName_date
firstName_von_lastName_date
Для которого требуемый вывод должен быть:
de_lastName_firstName_date
von_lastName_firstName_date
date
всегда последний элемент. Я хочу сделать то использование rename
в ударе, предпочтительно, или расширении Параметра оболочки.
Можно сделать это с помощью основанного на Perl rename
Я думаю, с помощью соединения нежадных и жадных соответствий напр.
$ rename -n 's/^(.*?)_(.*)_(.*?)$/$2_$1_$3/' *
rename(firstName_de_lastName_date, de_lastName_firstName_date)
rename(firstName_lastName_date, lastName_firstName_date)
rename(firstName_von_lastName_date, von_lastName_firstName_date)
Нежадный модификатор на последнем (date
) группа не действительно необходима - но мне нравится симметрия.
С другой стороны, с одной только оболочкой
$ for f in *; do
m="${f#*_}"; m="${m%_*}"; echo mv -- "$f" "${m}_${f%%_*}_${f##*_}";
done
mv -- firstName_de_lastName_date de_lastName_firstName_date
mv -- firstName_lastName_date lastName_firstName_date
mv -- firstName_von_lastName_date von_lastName_firstName_date