Processamento de Imagens Bash

0

Tudo,

OK! Tentando mover o arquivo de imagem para a pasta de imagens centrais. Aqui está o meu script:

img_dir='/home/filies/images/'
img_fil='/home/files/img_dump.txt'
i='0'
while read -r fline
do
   fpath=$(dirname "$fline")"/"
   fname=$(basename "$fline")".$i"         
   nfile="$img_dir$fname"
   if [ ! -e "$nfile" ]; then
#      mv "$fline $img_dir$nfile"
      echo "NF=> $nfile"
   else
      ((i++))
#      mv "$fline $img_dir$nfile.$i"
      echo "F=> $fname P=> $fpath"
   fi 
done < ${img_fil}
exit

Movimentos de arquivos atualmente comentados, até eu acertar ou ter pelo menos um resultado agradável.

Existem dups e meu script atual não incrementará o contador apenas para os dupes do mesmo nome de arquivo, mas para cada ocorrência de dupe.

Existe uma maneira melhor de fazer isso e / ou posso criar uma sub-rotina que faça uma pesquisa no novo diretório de imagens para encontrar o número de incremento mais recente?

Felicidades

OMR

    
por OldManRiver 26.02.2018 / 21:43

2 respostas

1

Você poderia fazer um loop no seu script:

nfile="$img_dir$fname"
while [ -e "$nfile" ]
do
  ((i++))
  fname=$(basename "$fline")".$i" 
  nfile="$img_dir$fname"
done

Agora você tem um nome de arquivo não usado

    
por 26.02.2018 / 21:57
0

Você pode carregá-los em uma matriz com globbing e usar o tamanho da matriz:

shopt -s nullglob
dups=("$nfile".*)
shopt -u nullglob
i=${#dups[@]}
((i++))

A numeração vai de 1 para cima, portanto, quando a contagem de arquivos for 0, você ainda precisará aumentá-la uma vez para obter 1. A configuração nullglob é necessária, caso contrário, o tamanho da matriz seria 1, como explicado aqui: href="https://unix.stackexchange.com/questions/426816/how-to-create-a-possibly-empty-array-from-filename-glob#426817"> Como criar uma matriz possivelmente vazia do nome do arquivo glob shopt -u nullglob faz o inverso, ie. isso desativa o nullglob .

Há uma pegadinha aqui com outros nomes de arquivos que se encaixam no padrão "$nfile".* . * irá corresponder a qualquer coisa, não apenas números, por isso esteja avisado.

O todo ficaria assim:

img_dir='/home/filies/images/'
img_fil='/home/files/img_dump.txt'
#i='0'
while read -r fline
do
   fpath=$(dirname "$fline")"/"
   fname=$(basename "$fline")".$i"         
   nfile="$img_dir$fname"
   if [ ! -e "$nfile" ]; then
      mv "$fline $img_dir$nfile"
      echo "NF=> $nfile"
   else
      shopt -s nullglob
      dups=("$nfile".*)
      shopt -u nullglob
      i="${#dups[@]}"
      ((i++))
      mv "$fline $img_dir$nfile.$i"
      echo "F=> $fname.$i P=> $fpath"
   fi 
done < "${img_fil}"
exit 

Observe a linha

i='0'

está comentado. Em primeiro lugar, porque nesta situação não é necessário. Em segundo lugar, se você usar outra maneira de resolver isso, tenha cuidado para que o valor de i permaneça aumentado após cada loop de while se você não redefini-lo.

Eu adicionei .$i para você nessa linha, então remova-a se não for o que você quer:

echo "F=> $fname.$i P=> $fpath" 
    
por 26.02.2018 / 22:21

Tags