zmv comando para renomear o arquivo após o padrão de correspondência

3

Eu estava tentando descobrir uma solução para esta pergunta usando zmv . Não consigo encontrar uma solução exata usando zmv . Isso é o que eu poderia fazer até agora.

De aqui , eu poderia renomear todos os arquivos como 1.jpg , 2.jpg , 34.jpg etc como 001.jpg , 002.jpg e 034.jpg usando o comando

zmv '(<1->).jpg' '${(l:3::0:)1}.jpg'

Agora, preciso modificar zmv para ter alguns padrões no começo, para que eu possa renomear os arquivos. No entanto, não consigo fazer isso. O mais próximo que pude encontrar é essa solução .

c=1 base='0-' zmv '*.jpg' '${base}${(l:3::0:)$((c++))}.jpg'

No entanto, o problema com a abordagem acima é se eu tiver arquivos como 0-1.jpg , 0-44.jpg , o comando acima substituirá como 0-001.jpg e 0-002.jpg em vez de 0-001.jpg e 0-044.jpg . / p>

Como devo modificar o comando zmv para realizar a renomeação como desejado?

    
por Ramesh 16.09.2014 / 04:13

2 respostas

3

Você pode usar o -l sinalizador de expansão :

l:expr::string1::string2:

Pad the resulting words on the left. Each word will be truncated if required and placed in a field expr characters wide.

The arguments :string1: and :string2: are optional; neither, the first, or both may be given. Note that the same pairs of delimiters must be used for each of the three arguments. The space to the left will be filled with string1 (concatenated as often as needed) or spaces if string1 is not given. If both string1 and string2 are given, string2 is inserted once directly to the left of each word, truncated if necessary, before string1 is used to produce any remaining padding.

If the MULTIBYTE option is in effect, the flag m may also be given, in which case widths will be used for the calculation of padding; otherwise individual multibyte characters are treated as occupying one unit of width.

If the MULTIBYTE option is not in effect, each byte in the string is treated as occupying one unit of width.

Control characters are always assumed to be one unit wide; this allows the mechanism to be used for generating repetitions of control characters.

Tente:

zmv '([0-9])-([0-9]##).(jpg)' '$1-${(l:3::0:)2}.$3'
    
por 16.09.2014 / 04:39
2

Tenha em atenção que ${(l:3::0:)var} será preenchido com zeros mas também truncará um var com mais de 3 caracteres ( 1234 será alterado para 234 ).

Outra alternativa é usar typeset -Z3 à laksh:

typeset -Z3 z3
zmv '([0-9]-)(<->)(.jpg)' '$1${${z3::=$2}+}$z3$3'

Estamos usando ${${z3::=$2}+} acima para acionar a atribuição para z3 . O próximo $z3 expande z3 com 0 preenchimento.

    
por 16.09.2014 / 17:28

Tags