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

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

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

  • команда find / rename не работает
  • Расширяет ли расширение zsh по-разному в неинтерактивных скриптах?
  • Почему «sudo su» в сценарии оболочки не запускает остальную часть скрипта как root?
  • linux + awk + манипуляция файлами
  • Форматирование вывода: Подчеркивание
  • Что означает поиск файла в оболочке?
  •  ls | awk print '$NF", " $1,$2 ...' 

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

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

  • Сценарий оболочки для объединения файлов с одинаковыми именами
  • Как легко обновить список md5sums?
  • Как отображать «доступные для человека» размеры файлов в результатах поиска?
  • Команда Shell для удаления первой строки, заключенной с косой чертой
  • Получайте отдельную информацию о памяти из free -m comand
  • wget пакетный файл linux
  • 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 - лучшая ОС в мире.