Bash: verificando a exclusividade dos nomes de arquivos e renomeando ou removendo arquivos

1

Estou trabalhando no CentOS com o bash e tenho arquivos em um diretório da seguinte forma:

16948.png 
16948_thumb.png
16948-1_thumb.png  
16949.png  
16948_thumb.png
16949-1_thumb.png 
16950-1.png  
16950-1_thumb.png
16950-2.png  
16950-2_thumb.png

Eu gostaria de fazer o seguinte:

  • Para cada número único N que existe na lista de arquivos:
    • verifique se existe um arquivo N-1.png:
    • se não, crie-o copiando N.png para N-1.png (sempre haverá um N.png)
    • exclua o arquivo N.png
    • verifique se há um arquivo N-1_thumb.png:
    • se não, crie-o copiando N_thumb.png para N-1_thumb.png (sempre haverá um N_thumb.png)
    • exclua o arquivo N_thumb.png.

No entanto, meu shell script não é bom o suficiente para chegar perto disso. Isso é tanto quanto eu tenho - alguém pode ajudar?

#!/bin/sh

declare -a unique_numbers
for filename in ./images
do
  // split filename at - or _ to get N, and then check 
  // whether N is already in list of unique numbers
  // if it is, skip
  continue
  // if it isn't, append to unique_numbers
  unique_numbers+=(N)
  // then check whether there is a file N-1.png.. etc
done;
    
por Richard 10.01.2012 / 12:31

1 resposta

1

Se eu entendi bem, isso deve ser feito. O primeiro loop lida com todos os arquivos chamados Number.png e o segundo lida com todos os arquivos chamados Number_thumb.png .

#!/bin/sh

for number in 'ls -1 images/*.png | grep -v thumb | grep -v "-" | cut -f2 -d / | cut -f1 -d .'
do
  if [ ! -e "./images/$number-1.png" ] ; then
        cp images/"$number.png" images/"$number-1.png"
  fi
  rm ./images/"$number.png"
done;

for number in 'ls -1 images/*.png | grep thumb | grep -v "-" | cut -f2 -d / | cut -f1 -d . | cut -f1 -d _'
do
  echo $number
  if [ ! -e "./images/$number-1_thumb.png" ] ; then
        cp images/"$number"_thumb.png images/"$number-1_thumb.png"
  fi
  rm ./images/"$number"_thumb.png
done;
    
por 10.01.2012 / 13:06