Как переместить один файл с расширениями (.JPEG, .JPG, .jpeg, .jpg) и изменить расширение на .jpg с помощью Linux bash

У меня есть сценарий ожидания inotify, который перемещает файл из одного места в другое всякий раз, когда обнаруживает, что файл был загружен в исходный каталог.

Проблема, с которой я столкнулся, заключается в том, что мне нужно сохранить базовое имя файла и преобразовать следующие расширения: .JPEG, .JPG, .jpeg в .jpg, чтобы файл был переименован только с расширением .jpg.

В настоящее время у меня есть это:

TARGET="/target"
SRC="/source"
( while [ 1 ]
    do inotifywait  -m -r -e close_write --format %f -q \
        $SRC | while read F
            do mv "$SRC/$F" $TARGET
            done
    done ) &

Поэтому мне нужен способ разделить и проверить эти нестандартные расширения и переместить файл с правильным расширением. Все файлы, не имеющие этих 4 расширений, просто перемещаются как есть.

Спасибо!

Дэйв


person dnpage    schedule 14.08.2013    source источник


Ответы (2)


Использование опции extglob с некоторым расширением параметров:

#! /bin/bash
shopt -s extglob
TARGET=/target
SRC=/source
( while : ; do
    inotifywait -m -r -r close_write --format %f -q \
        $SRC | while read F ; do
    basename=${F##*/}                               # Remove everything before /
    ext=${basename##*.}                             # Remove everything before .
    basename=${basename%.$ext}                      # Remove .$ext at the end
    if [[ $ext == @(JPG|JPEG|jpeg) ]] ; then        # Match any of the words
        ext=jpg
    fi
    echo mv "$F" "$TARGET/$basename.$ext"

        done
  done ) &
person choroba    schedule 14.08.2013

Попробуйте этот формат. (обновлено)

TARGET="/target"
SRC="/source"

(
    while :; do
        inotifywait  -m -r -e close_write --format %f -q "$SRC" | while IFS= read -r F; do
            case "$F" in
            *.jpg)
                echo mv "$SRC/$F" "$TARGET/"  ## Move as is.
                ;;
            *.[jJ][pP][eE][gG]|*.[jJ][pP][gG])
                echo mv "$SRC/$F" "$TARGET/${F%.*}.jpg"  ## Move with new proper extension.
                ;;
            esac
        done
    done
) &

Удалите echo из команд mv, если вы уже нашли это правильным. Также он предназначен для bash, но также может быть совместим с другими оболочками. Если вы получили сообщение об ошибке с командой read, попробуйте удалить параметр -r.

person konsolebox    schedule 15.08.2013