Части подкачки имен файлов

Проблема

У меня есть тысячи папок, как которые структурированы имена:
firstName_lastName_date
для которого я хочу подкачать две первых части с помощью подчеркивания _ как разделитель для окончания с:
lastName_firstName_date

Предупреждение

lastName может быть предшествоваться дворянской частицей, разделенной с дополнительным _ во входных папках.
Например:
firstName_de_lastName_date
firstName_von_lastName_date

Для которого требуемый вывод должен быть:
de_lastName_firstName_date
von_lastName_firstName_date

Информация

  • date всегда последний элемент.
  • Имена являются отдельными словами.
  • Фамилии являются отдельными словами или составленными словами (2) с частицей.

Инструменты

Я хочу сделать то использование rename в ударе, предпочтительно, или расширении Параметра оболочки.

1
задан 19 January 2020 в 16:08

1 ответ

Можно сделать это с помощью основанного на 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
4
ответ дан 20 January 2020 в 00:34

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

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