Переименуйте каталоги с "fname lname" на "lname, fname "

У меня есть набор каталогов с именами авторов как «first [mi] last» (средний начальный / имя может быть кратным), и я хотел бы изменить их на «last, first mi». Поэтому я хотел бы разобрать имя на несколько токенов, а затем изменить маркеры.

В awk это будет что-то вроде:

 ls | awk print '$NF", " $1,$2 ...' 

Конечно, мне нужна логика для вычисления количества токенов и избежания дублирования имени в конце. К сожалению, я не знаю достаточно об awk или shell-скриптах, чтобы легко написать всю команду или скрипт, и надеялся, что у кого-то есть что-то похожее, на которое я мог бы смотреть, или мог бы указать мне в правильном направлении.

Я надеюсь, что кто-то уже сделал что-то подобное и может помочь.

  • Как использовать команду чтения с вопросом и переменной alltogether?
  • VNC / SSH: как выполнить команду после входа?
  • Различия в перенаправлении между &>> & и 2> & 1
  • Как wc -l `ls` дает фактическое количество строк?
  • grep и знак доллара
  • Как установить работу cron для системы
  • Как мне регистрировать xargs -0 rm?
  • Как получить текущий счет строки из xargs?
  • One Solution collect form web for “Переименуйте каталоги с "fname lname" на "lname, fname "”

    Это должно работать и быть несовместимым с оболочкой, запускать его как скрипт с единственным параметром, который является вашим базовым каталогом.

    1. Он использует find чтобы получить имена каталогов по одной в каждой строке, предполагая, что они расположены непосредственно ниже поставляемого базового каталога и исключая любые, которые уже были преобразованы.

    2. Он использует awk для удаления базового каталога из списка, оставляя в каждой строке только имя ближайшего каталога, который вы хотите изменить. ( awk здесь использует / как разделитель полей и печатает последнее поле в каждой строке.)

    3. Он использует awk второй раз, чтобы распечатать команду mv чтобы переименовать каждый из этих каталогов так, как вы просили. ( awk здесь использует пробел по умолчанию в качестве разделителя полей.)

    4. Сохраните вывод в файл, а затем выполните его, когда будете удовлетворены, он выглядит правильно.

    ,

     #!/bin/sh find "$1" -mindepth 1 -maxdepth 1 -type d -not -name "*,*"|\ awk -F/ '{print $NF}'|\ awk -v DIR="$1" '{printf "mv \"" DIR "/" $0 "\" \"" DIR "/" $NF", "; for (i=1; i<NF; i++) {printf $i" "}; printf "\"\n"}' 
    Linux и Unix - лучшая ОС в мире.