Correspondência de padrões no script Bash para os nomes de arquivos zerados

2

Eu quero zerar os nomes dos arquivos. Estou usando este script de aqui .

#!/bin/bash
num='expr match "$1" '[^0-9]*\([0-9]\+\).*''
paddednum='printf "%03d" $num'
echo ${1/$num/$paddednum}

Este nome de arquivo de saída de script com zero-pad para números anteriores:

$ zeropad "folder01/01.jpg"
folder001/01.jpg

Mas eu quero zerar esses últimos números assim:

$ zeropad "folder01/01.jpg"
folder01/001.jpg

Como posso fazer isso? E existe uma página da web que eu possa ver muitos exemplos de combinações de padrões de Bash?

    
por ironsand 23.09.2013 / 19:24

3 respostas

4
path="folder01/01.jpg"
dir=$(dirname "$path")
file=$(basename "$path")
ext=${file##*.}
file=${file%.*}
# assume file is composed of digits here
printf -v newname "%s/%03d.%s" "$dir" $file "$ext"
echo "$newname"
    
por 23.09.2013 / 20:30
1

Você deve separar folder01/01.jpg em duas strings: folder01 e 01.jpg , fazer as alterações em 01.jpg e, finalmente, reuni-las novamente:

#!/bin/bash

dir='echo $1 | cut -d/ -f 1'    #or dir='dirname $1'
file='echo $1 | cut -d/ -f 2'   #or file='basename $1'

num='expr match "$file" '[^0-9]*\([0-9]\+\).*''
paddednum='printf "%03d" $num'
echo "$dir/${file/$num/$paddednum}"

E o Google é seu amigo para encontrar muitas páginas da Web (não apenas uma), onde você pode ver muitos exemplos de correspondências de padrões do Bash. Na verdade, esse tipo de pergunta é fora do tópico aqui.

    
por 23.09.2013 / 21:02
0

Sempre que vejo um problema de expressões regulares, meu primeiro instinto é Perl:

for file in folder01/*.jpg;do
    echo "$file"|perl -pe 's/([0-9]+)([^0-9]+)\Z/sprintf "%03d%s",$1,$2/e'
done

Isso não pressupõe que o nome do arquivo seja composto apenas de dígitos.

    
por 23.09.2013 / 20:40

Tags