Renomeia o nome do arquivo entre dois pontos

0

Estou procurando uma maneira de renomear um lote de vídeos removendo o texto entre dois pontos. Especificamente, gostaria de remover tudo após o 6º caractere, até o último "LabelMe -".

0001--LabelMe--A005_01241110_C001--LabelMe-- --Interview--Man in library.mov

0002--LabelMe--A005_01241110_C002--LabelMe-- --Broll--Man looking at books.mov

0003--LabelMe--A005_01241111_C003--LabelMe-- --Broll--messed up--LabelMe-- --Broll--Sitting at table.mov

Estou tentando fazer isso usando os serviços do Automator da Apple. Clique com o botão direito em vários arquivos e selecione o serviço para limpar o nome. Eu encontrei um pedaço de código, mas não tenho certeza se estou usando corretamente.

for f in "$@"
do 
    echo sed -e 's/\(--LabelMe).*\(LabelMe--)//'
done

    
por Chad 09.02.2018 / 00:09

2 respostas

0

Há um monte de perguntas neste site sobre renomear arquivos usando loops de shell como esse, e alguns sobre o uso de sed para isso. (por exemplo, isso , this )

Você precisará passar o nome do arquivo para sed com um pipe e usar a substituição de comando para capturar o resultado, algo assim:

mv "$f" "$(echo "$f" | sed -e '...' )"

O comando sed que você usou precisa de um pouco de correção: Por um lado, você citou o parêntese de abertura, mas não os de fechamento, então o agrupamento não funcionará. Além disso, não sei por que você gostaria de colocar os fragmentos LabelMe de volta no nome do arquivo. Se você quiser removê-los, basta pular o agrupamento e as referências \N :

's/--LabelMe.*LabelMe--//'

Então, na íntegra:

for f in "$@"
do 
    mv "$f" "$(echo "$f" | sed -e 's/--LabelMe.*LabelMe--//' )"
done

Outra maneira seria usar a substituição de parâmetros do shell para fazer o mesmo. A substituição ${par/pattern/replacement} não é padrão, mas é suportada em muitos shells:

for f in "$@"
do 
    mv "$f" "${f/--LabelMe*LabelMe--/}"
done

(note que não é uma regex, então a sintaxe de "qualquer coisa" é apenas * e não .* )

    
por 09.02.2018 / 10:20
1

Use (perl) renomear. Eu não sei sobre a Apple, mas as distribuições Linux são enviadas principalmente com duas versões de renomeação. Renomear Perl é o mais poderoso.

Primeiramente, execute o comando com o -n flag, que faz um "dry-run" e não faz alterações.

$ rename 's/(.{6}).*LabelMe--/$1/' 000* -n
0001--LabelMe--A005_01241110_C001--LabelMe-- --Interview--Man in library.mov -> 1110_C --Interview--Man in library.mov
0002--LabelMe--A005_01241110_C002--LabelMe-- --Broll--Man looking at books.mov -> 1110_C --Broll--Man looking at books.mov
0003--LabelMe--A005_01241111_C003--LabelMe-- --Broll--messed up--LabelMe-- --Broll--Sitting at table.mov -> messed --Broll--Sitting at table.mov

Quando estiver satisfeito com o resultado, execute-o de verdade, por exemplo, rename 's/(.{6}).*LabelMe--/$1/' 000*

Explicação

  • rename 's/foo/bar/' 000* : este formato irá procurar o foo regex e substituí-lo por bar . Ele funcionará em todos os arquivos correspondentes ao glob 000* .
  • (.{6}).*LabelMe-- : esta é a regex que você está procurando. Você está procurando por seis de qualquer caractere .{6} , que você colocou em um grupo de captura (.{6}) . Depois disso, você pode ter qualquer caractere .* , antes de encontrar LabelMe-- .
  • $1 : É com isso que você substituirá a string acima. $1 refere-se ao conteúdo do grupo correspondente (.{6}) acima. O restante não será substituído, ou seja, você excluirá tudo depois dos seis primeiros caracteres até e incluindo LabelMe-- .
por 09.02.2018 / 00:16