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"
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?
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.
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.
Tags bash