Renomeia os diretórios de “fname [mname] lname” para “lname, fname [mname]”

3

Eu tenho um monte de diretórios com nomes de autores como "first [mi] last" (inicial / nome do meio podem ser múltiplos), e gostaria de alterá-los para "last, first mi". Então, gostaria de analisar o nome em vários tokens e reorganizá-los.

Em awk , seria algo como:

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

É claro que preciso da lógica para calcular o número de tokens e evitar a duplicação do sobrenome no final. Infelizmente, eu realmente não sei o suficiente sobre awk ou shell script para escrever facilmente todo o comando ou script, e estava esperando que alguém tivesse algo parecido que eu pudesse ver, ou poderia me apontar na direção certa.

Espero que alguém já tenha feito algo assim e possa ajudar.

    
por Marty Fried 08.07.2016 / 01:54

1 resposta

2

Isso deve funcionar e ser agnóstico de shell, executá-lo como um script com um único parâmetro, que é o seu diretório base.

  1. Ele usa find para obter os nomes dos diretórios um por linha, presumindo que eles estejam localizados imediatamente abaixo do diretório base fornecido e excluindo quaisquer que já tenham sido convertidos.

  2. Ele usa awk para remover o diretório base da lista, deixando em cada linha apenas o nome do diretório imediato que é o que você deseja alterar. ( awk aqui usa / como um delimitador de campo e imprime o último campo em cada linha.)

  3. Ele usa awk uma segunda vez para imprimir um comando mv para renomear cada um desses diretórios da maneira que você solicitou. ( awk aqui usa o espaço em branco padrão como um delimitador de campo.)

  4. Salve a saída em um arquivo e execute-a quando estiver satisfeito.

.

#!/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"}'
    
por 08.07.2016 / 06:03