Usando BASH versus ASH em Synology

2

A maioria dos meus arquivos de foto tem a seguinte convenção de nomenclatura / formato IMG_20131204_120000.JPG , mostrando a data e a hora em que a foto foi tirada (convenção de nomenclatura iPhone / Apple). No entanto, nem todas as minhas fotos seguem essa convenção de nomenclatura. Com a ajuda deste fórum, desenvolvemos o script da seguinte forma:

for x in *.JPG *.jpg *.TIF *.tif *.PNG *.png *.BMP *.bmp *.GIF *.gif *.IMG *.img *.JPEG *.jpeg *.TIFF *.tiff; do
  d=$(date -r "$x" +%Y%m%d)" - Family Photos"
  if [[ "$x" =~ ^[iI][mM][gG][_-][1-2][09][0-9][0-9][0-1][0-9][0-3][0-9][_-][0-2][0-9][0-6][0-9][0-6][0-9][.][a-zA-Z]*$ ]]; then
    d=$(expr substr "$x" 5 8)" - Family Photos"
  fi
  mkdir -p "$d" >/dev/null 2>&1
  mv -- "$x" "$d/" >/dev/null 2>&1
done
rmdir ' - Family Photos' >/dev/null 2>&1

Eu uso a instrução if para obter a data do nome do arquivo se o nome do arquivo estiver no formato IMG_20131204_120000.JPG , pois essa data reflete com mais precisão a data em que a foto foi tirada, mas se o arquivo não siga esta convenção de nomenclatura Eu tomo a data do sistema operacional de quando o arquivo foi modificado / criado pela última vez.

Eu pretendo executar este script todas as noites para categorizar as fotos enviadas durante as 24 horas anteriores. Meu problema é que agora eu descubro que meu sistema Synology suporta apenas shell ASH e não BASH e, portanto, a expressão regular =~ na instrução if não funciona. Eu posso usar o IPKG para instalar um pacote BASH. Existe uma maneira fácil de ter apenas este script usar BASH, enquanto o resto do sistema está intacto e usa ASH? Ou, como alternativa, há uma maneira de fazer a mesma coisa na instrução if usando o shell ASH?

    
por Wags 07.12.2013 / 15:46

1 resposta

2

Ash não tem expressões regulares, mas tem correspondência de curingas de shell. Você precisa usar case , a correspondência de caractere curinga não está disponível por test a.k.a. [ … ] .

Não há como expressar o regex [a-zA-Z]* usando caracteres curinga, mas você pode realizar o mesmo teste em duas etapas, uma para a primeira e outra para a segunda parte.

case "$x" in
  [iI][mM][gG][-_][1-2][09][0-9][0-9][0-1][0-9][0-3][0-9][_-][0-2][0-9][0-6][0-9][0-6][0-9][.]*)
    case "${x#*.}" in
      *[!a-zA-z]*) :;;
      *) d=${x#*[-_]}; d="${d%%[-_]*} - Family Photos";;
    esac
esac

As construções de decodificação de prefixo e sufixo são portáveis para todos os shells POSIX, você não precisa usar expr .

    
por 07.12.2013 / 17:04