Removendo uma string de arquivos com renomeação

2

Eu tenho tentado renomear em lote vários arquivos para que eles fiquem consistentes e se encaixem na estrutura de nomes que eu criei. Por exemplo, estou renomeando comics e, portanto, tenho um diretório semelhante a este:

$ls *.cbr
Injustice - Gods Among Us 001 (2013) (Digital) (K6 of Ultron-Empire).cbr
Injustice - Gods Among Us 002 (2013) (Digital) (K6 of Ultron-Empire).cbr 
Injustice - Gods Among Us 003 (2013) (Digital) (K6 of Ultron-Empire).cbr

Meu objetivo é usar renomear os arquivos para que eles se pareçam com o seguinte:

Injustice - Gods Among Us 001.cbr
Injustice - Gods Among Us 002.cbr
Injustice - Gods Among Us 003.cbr

Então eu tentei o seguinte:

rename -n 's/^\d{3}.\.cbr/^\ .cbr/' *.cbr

Assumindo que, ao delimitar a primeira configuração do problema de 3 dígitos, eu poderia mudar para renomear tudo a partir da linha inicial (Injustiça - Deus entre nós) e adicionar o número de 3 dígitos (\ d { 3}) tudo iria sair. Escusado será dizer que não.

Embora eu queira uma pequena orientação sobre como resolver isso, realmente quero entender melhor como usar o pregex para uso futuro.

    
por K. Callis 30.09.2013 / 02:03

2 respostas

2

Eu acho que você está entendendo errado o significado da âncora de linha de carat ( ^ ) - isso não significa 'procure por um padrão começando com o seguinte regex', significa 'procure por uma linha começando com o seguinte padrão '- que obviamente não irá combinar com nenhum dos seus nomes de arquivos listados, porque o 001 ... 003 vem a meio do nome. / p>

O que você provavelmente está pensando são as construções de lookaround do Perl - por exemplo, para limitar sua correspondência à parte do nome após a primeira sequência de 3 dígitos, você pode usar um (?<=\d{3}) < em> lookbehind . Da mesma forma, para limitar a correspondência à parte antes do sufixo .cbr , você poderia usar o lookaheaad (?=\.cbr) . Por fim, você pode corresponder qualquer caractere entre o lookbehind e o lookahead, ou seja, .* e substituí-los por nada:

$ rename -nv 's/(?<=\d{3}).*(?=.cbr)//' *.cbr
Injustice - Gods Among Us 001 (2013) (Digital) (K6 of Ultron-Empire).cbr renamed as Injustice - Gods Among Us 001.cbr
Injustice - Gods Among Us 002 (2013) (Digital) (K6 of Ultron-Empire).cbr renamed as Injustice - Gods Among Us 002.cbr
Injustice - Gods Among Us 003 (2013) (Digital) (K6 of Ultron-Empire).cbr renamed as Injustice - Gods Among Us 003.cbr

Note que normalmente há várias maneiras diferentes de combinar e renomear um determinado conjunto de arquivos. Não sei se isso é o mais eficiente ou robusto, no entanto, espero que ele ilustre o que eu penso que você era. atirando para.

    
por steeldriver 30.09.2013 / 02:47
1

Suponho que a string (2013) (Digital) (K6 of Ultron-Empire) esteja corrigida em todos os arquivos. Na verdade, você não precisa de nada muito complexo:

$ ls 
Injustice - Gods Among Us 001 (2013) (Digital) (K6 of Ultron-Empire).cbr
Injustice - Gods Among Us 002 (2013) (Digital) (K6 of Ultron-Empire).cbr
Injustice - Gods Among Us 003 (2013) (Digital) (K6 of Ultron-Empire).cbr
$ rename 's/ \(2013\) \(Digital\) \(K6 of Ultron\-Empire\)//g' *
$ ls
Injustice - Gods Among Us 001.cbr  Injustice - Gods Among Us 003.cbr
Injustice - Gods Among Us 002.cbr

Eu dei flexibilidade para praticidade. Se você quiser remover tudo entre (...) , pode usar até mesmo métodos mais inteligentes :

rename -n 's/ ([(].*Digital.*[)])//g' *

Além disso, o seu regex não está selecionando nada de fato. Eu lia esta resposta para entender como o \d{3} funciona.

    
por Braiam 30.09.2013 / 02:35