Renomeando diretórios baseados em um padrão

0

Gostaria de renomear todos os diretórios no mesmo diretório se o diretório corresponder a um padrão que o padrão para encontrar é user1 [files.sentfrom.com] - Exemplo: Nome do diretório é:

user1 [files.sentfrom.com] - Directory-Subject

Aqui está uma imagem anterior do diretório.

Euquerorenomearonomedodiretórioparadizerapenas:

Directory-Subject(thiscouldhavedifferenttypeoftext)

Aquiestáaimagemapóscomosdiretóriosrenomeados,notequeelanãorenomeianenhumaoutrapastaouarquivonodiretório.

Isso pode ser feito no regex de uma só vez ou eu preciso de um loop para que eu esteja aberto para outra maneira também.

Obrigado

    
por Rick T 11.02.2017 / 15:50

3 respostas

2
for name in *\[*\]\ -\ *; do
  if [[ -d "$name" ]] && [[ ! -e "${name#* - }" ]]; then
    mv "$name" "${name#* - }"
  fi
done

O loop acima, que funcionaria em bash ou ksh93 , passa por todos os nomes no diretório atual que correspondem ao padrão globbing de nome de arquivo *\[*\]\ -\ * (os colchetes e espaços precisam ser escapados do shell) e testes para se certificar de que é um diretório e que o nome modificado ainda não existe. Se tudo estiver ok, então ele renomeia o diretório.

A expansão do parâmetro ${name#* - } assumirá o valor da variável name e removerá tudo desde o início até a primeira ocorrência de ␣-␣ (espaço-traço-espaço).

    
por 11.02.2017 / 16:49
2

Você pode usar rename para isso:

rename 's/.* ([^ ]*)$/$1/' *

Ele removerá todos os caracteres até o último espaço em cada nome de arquivo no diretório.

    
por 11.02.2017 / 16:11
0

encontrar e renomear é uma equipe poderosa. Com a opção -0 , todos os nomes de arquivos possíveis são tratados de maneira clara:

find -maxdepth 1 -type d -print0 | xargs -0 rename s/.*Directory-/Directory-/
    
por 11.02.2017 / 17:33

Tags