Estou procurando duas linhas de renomeação para gerenciar minha biblioteca de música.
O primeiro diz respeito aos nomes dos arquivos . Gostaria de usar nomes o mais simples possíveis, ou seja: %track %title.ext
por exemplo 01 Song name.mp3
13 Song title.flac
, etc. Os arquivos que tenho atualmente usam um hífen como separador (entre o número da faixa e o título da música), o que considero supérfluo.
Em segundo lugar , diz respeito aos nomes das pastas , preciso mudar alguns padrões
de GENRE - Styles - ARTIST - Album (Year)
para GENRE - Styles - ARTIST - Year Album
(mudar as seções Ano e Álbum e também omitir parênteses)
(Eu executo o openbsd com ksh88 .)
Aqui está a frase mais próxima que consegui inventar para o caso de nomes de arquivos :
for f in * ; do mv "$f" "$(print "$f" | sed "s/ - / /")" ; done
Mas ainda não funciona. Suponho que tenha a ver com a inclusão correta do segundo argumento (destino) no mv
comando ( EDIT : adicionei aspas $( ... )
e funciona, o que eu não esperava)
$pwd
/home/media/E - Chanson Française/CHANSON - Chanson Française - CHARLES TRENET - Le meilleur de Charles Trenet
$l -1
01 - Boum!.flac
02 - La route enchantée.flac
03 - Ah! Dis, Ah! Dis, Ah! Bonjour!.flac
04 - La vie qui va.flac
05 - Quand j'etais p'tit.flac
06 - Ménilmontant.flac
07 - Tout me sourit.flac
08 - Le oiseaux de Paris.flac
...
$for f in * ; do mv "$f" "$(print "$f" | sed 's/ - / /')" ; done
$l -1
01 Boum!.flac
02 La route enchantée.flac
03 Ah! Dis, Ah! Dis, Ah! Bonjour!.flac
04 La vie qui va.flac
05 Quand j'etais p'tit.flac
06 Ménilmontant.flac
07 Tout me sourit.flac
08 Le oiseaux de Paris.flac
...
Achei que ter aspas duplas aninhadas produziria um erro, mas funciona. Então, primeiro caso resolvido.
O caso dos nomes das pastas me escapa mais. Aqui estão alguns exemplos de nomes que gostaria de alterar:
$ ls -1
...
ELECTRO - Cyberpunk - CARPENTER BRUT - Blood Machines (2020)
ELECTRO - Cyberpunk - CARPENTER BRUT - Leather Teeth (2018)
ELECTRO - Cyberpunk - CARPENTER BRUT - Leather Terror (2022)
ELECTRO - Cyberpunk - CARPENTER BRUT - Trilogy (2015)
...
REGGAE - Roots - GROUNDATION - Each One Teach One (2001)
REGGAE - Roots - GROUNDATION - Hebron Gate (2002)
REGGAE - Roots - GROUNDATION - Upon the Bridge (2006)
REGGAE - Roots - GROUNDATION - Young Tree (1999)
...
O resultado deve ser algo como:
$ ls -1
...
ELECTRO - Cyberpunk - CARPENTER BRUT - 2015 Trilogy
ELECTRO - Cyberpunk - CARPENTER BRUT - 2018 Leather Teeth
ELECTRO - Cyberpunk - CARPENTER BRUT - 2020 Blood Machines
ELECTRO - Cyberpunk - CARPENTER BRUT - 2022 Leather Terror
...
REGGAE - Roots - GROUNDATION - 1999 Young Tree
REGGAE - Roots - GROUNDATION - 2001 Each One Teach One
REGGAE - Roots - GROUNDATION - 2002 Hebron Gate
REGGAE - Roots - GROUNDATION - 2006 Upon the Bridge
...
Suponho que preciso usar o awk para trocar de campo: algo como for f in *CARPENTER\ BRUT* ; do mv "$f" "$( print "$f" | awk ... )" ; done
– com o awk trocando o ano após o último hífen e removendo os parênteses provavelmente com tr – mas estou tendo problemas para aprender neste momento.
Se você pode instalar o zsh:
XX - title.flac
paraXX title.flac
arquivos regulares.GENRE - Styles - ARTIST - Album (Year)
paraGENRE - Styles - ARTIST - Year Album
diretóriosRemova
-n
(ensaio) se estiver satisfeito.Se você não consegue instalar o zsh, você pode usar
find
eperl
para obter algo próximo de algo como:XX - title.flac
paraXX title.flac
arquivos normaisGENRE - Styles - ARTIST - Album (Year)
paraGENRE - Styles - ARTIST - Year Album
diretóriosE remova ao
print qq(...)
redorrename()
se estiver feliz.Mas cuidado com isso:
zmv
, portanto pode acabar sobrescrevendo os arquivos existentes.Fazer isso com os utilitários ksh e POSIX básicos do OpenBSD é possível, mas muito desajeitado:
Poderia ser:
XX - title.flac
paraXX title.flac
arquivos regulares.GENRE - Styles - ARTIST - Album (Year)
paraGENRE - Styles - ARTIST - Year Album
diretórios(remova o
print -r
se estiver feliz).Com as mesmas ressalvas da
perl
abordagem, embora a-i
opção passada paramv
ajude a evitar a perda de dados (não o fato de quemv
muda de movimento para para mover para se o arquivo de destino existir e for do tipo diretório).Sobre sua tentativa:
sed
é um utilitário de texto e é baseado em linhas, embora não seja garantido que os caminhos dos arquivos contenham texto e muito menos uma única linha de texto, portanto, é melhor evitar processar caminhos de arquivos com nomes de arquivos.print
, como muitas implementações deecho
aceita opções por padrão (algumas das quais podem introduzir a execução de comandos arbitrários, embora esse não pareça ser o caso para a implementação ksh do OpenBSD) e faz alguma expansão da sequência de escape de barra invertida. Para gerar texto literalmente (seguido por um caractere de nova linha para que termine em uma linha válida), você precisa deprint -r - "$text"
orprint -r -- "$text"
, especialmente se não puder garantir$text
que não começará com-
.$(...)
) sem aspas, split+glob acaba sendo aplicado ao resultado. Sim, você pode citá-lo. A citação aninhada só se torna um problema se você usar a`...`
forma obsoleta de substituição de comando, mas mesmo assim é possível, apenas mais desajeitado comcmd1 "`other-cmd \" $var \"`"
.$(...)
, remove todos os caracteres de nova linha finais, portanto, normalmente pode acabar removendo muitos.--
mv
também está faltando depois .mv
mesmo quesed
não tenha modificado os caminhos dos arquivos.for i in *
, se não houver nenhum arquivo não oculto no diretório de trabalho atual, ainda haverá um caminho no loop com*
o nome do arquivo.zsh
em vez disso ,zmv
reportará um erro sobre um arquivo não correspondente.(#q.)
===-type f
e(#q/)
===-type d
).