Erro no script bash simples - mv + awk

3

Eu tentei escrever um script que renomeia uma lista de diretórios em uma pasta. É um script bash e estou usando apenas o awk para realizar essa tarefa.

Formulário atual:

[2015] Name of the album

Forma desejada:

Name of the album - [2015]

Meu script:

#! /usr/bin/env bash
for f in \[*; do
    mv -t "$f" "$( awk -F '\] ' ' {print $2 " - " $1 "]"}' <<<"$f" )"
done

Quando executo o script acima, recebo o seguinte erro:

mv: cannot stat 'In Dreams [EP] - [1963]': No such file or directory
    
por GustavMahler 13.05.2017 / 14:45

3 respostas

5

Você não quer -t na sua situação. Isso dirá a mv para tentar mover o nome desejado para o diretório chamado $f .

Expandir-se-ia para algo como:

mv -t "[2015] Name of the album" "Name of the album - [2015]"

qual seria provavelmente o que você deseja sem o -t . Como é que trata $f como o nome do diretório de destino no qual todos os outros argumentos devem ser movidos.

    
por 13.05.2017 / 14:51
5

Se você tiver acesso a perl-rename (chamado rename em sistemas baseados no Debian, incluindo Ubuntu, perl-rename no Arch e prename em outros), você pode fazer:

perl-rename -n 's/(\[.*?\])\s*(.*)/$2 - $1/' ./\[*

Explicação

  • -n : isso faz com que perl-rename imprima o que ele fará sem realmente renomear nada. Execute-o assim e, se parecer que está funcionando como esperado, remova o -n para realmente renomear.
  • s/from/to/ : substituirá from por to .
  • s/(\[.*?\])\s*(.*)/$2 - $1/' : aqui, o from é tudo entre o primeiro [ e o primeiro ] ( \[.*?\] ). Em seguida, 0 ou mais caracteres em branco ( \s* ) e tudo mais ( .* ). Os parênteses em torno dos padrões serão capturados , deixando-os usá-los como $1 e $2 , respectivamente, no lado direito da substituição. Então, isso colocará tudo depois do [ ] ( $2 ) antes dos colchetes ( $1 ).
  • ./\[* executa-o em todos os arquivos e diretórios no diretório atual cujo nome começa com [ .
por 13.05.2017 / 16:35
4

Sua solução funciona se você remover a opção -t , como Eric explicou.

Esta é uma solução alternativa usando substituições de variáveis em vez de awk para mover os bits do nome do arquivo:

for name in '['*; do
    tag="${name%% *}"
    title="${name#* }"
    mv "$name" "$title - $tag"
done
  • ${name%% *} remove tudo após o primeiro espaço em $name (incluindo o espaço) e
  • ${name#* } remove tudo antes do primeiro espaço (incluindo o espaço).
por 13.05.2017 / 15:09