Como precede a quantidade apropriada de 0 para os números contidos nos nomes das imagens?

1

Eu tenho uma pasta /User/me/Desktop/folder/images com arquivos como key 1--name.jpg , key 10--name1.jpg , etc. Os arquivos são classificados incorretamente quando são enviados para o meu site para que eu receba um arranjo como key 84--name.jpg -> key 9--name.jpg -> key 94--name.jpg em vez de key 9--name.jpg -> key 84--name.jpg -> key 94--name.jpg de precedência de caráter. Então eu quero substituir todos os nomes de imagens não com três dígitos como 9, 12, 99 com seus equivalentes de três dígitos e 0-preenchidos para obter 009, 012, 099 , então a ordenação estará correta. Como isso pode ser feito para a pasta cheia de arquivos em uma linha no meu terminal Mac.

    
por Yarlo19 22.03.2016 / 21:36

2 respostas

0

Extrai o número, algo como:

$ echo 'key 88--name.jpg' | sed 's/key \([0-9]\+\)--.*//'
88

Formate-o com printf:

$ printf '%04d' "88"
0088

reinsira isso no nome:

$ echo 'key 88--name.jpg' | sed 's/\(key [0-9]\+--\)/key 0088--/'
key 0088--name.jpg

Tudo em um script:

#!/bin/sh
for f in 'key '*'--name.jpg'; do
    a="$( echo "$f" | sed 's/key \([0-9]\+\)--.*//' )"
    b="$( printf '%04d' "$a" )"
    c="$( echo "$f" | sed 's/\(key '"$a"'--\)/key '"$b"'--/' )"
    echo \
    mv -i "$f" "$c"
done

Ou ainda mais rápido:

#!/bin/sh
for f in 'key '*'--name.jpg'; do
    a="${f#key }"
    a="${a%--name.jpg}"
    b="$( printf 'key %04d--name.jpg' "$a" )"
    echo \
    mv -i "$f" "$b"
done

Ambos os scripts não alteram nada. Eles apenas listarão o que será mudado. Se você está feliz com o que vê, apenas comente (adicione um # na frente de) a linha echo \ . Em qualquer caso, o comando mv não irá sobrescrever nenhum arquivo se o arquivo já existir (a opção -i).

    
por 22.03.2016 / 23:12
0

Se você souber com antecedência quantos dígitos percorrer, isso poderá ser feito de maneira bastante simples combinando os recursos de manipulação e aritmética da string do shell. Para preencher até 3 dígitos, numere de 1000 e retire o primeiro 1 .

for current_name in *[0-9]*; do
  # Split the name into prefix, digits, suffix
  prefix=${current_name%%[0-9]*}; suffix=${current_name#"$prefix"}
  # Pad the digits
  digits=${suffix%%[!0-9]*}; suffix=${suffix#"$digits"}
  digits=$((digits+1000)); digits=${digits#1}
  # Rename the file
  new_name="$prefix$digits$suffix"
  if [ "$new_name" != "$current_name" ]; then
    mv -- "$current_name" "$new_name"
  fi
done
    
por 24.03.2016 / 01:09