如何使用(.JPEG,.JPG,.jpeg,.jpg)扩展名移动单个文件并使用Linux bash将扩展名更改为.jpg

时间:2013-08-14 22:28:10

标签: linux bash file-extension file-rename

我有一个inotify等待脚本,只要检测到文件已上传到源目录,它就会将文件从一个位置移动到另一个位置。

我面临的挑战是我需要保留文件的基本名称并将以下扩展名转换为:.JPEG,.JPG,.jpeg为.jpg,以便仅使用.jpg扩展名重命名文件。< / p>

目前我有这个:

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个扩展名的文件都会按原样移动。

谢谢!

戴夫

3 个答案:

答案 0 :(得分:3)

if [[ "$F" =~ .JPEG\|jpg\|jpeg\|jpg ]];then 
   echo mv $F ${F%.*}.jpg
fi

答案 1 :(得分:1)

使用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 ) &

答案 2 :(得分:1)

试试这种格式。 (更新)

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,但也可以与其他shell兼容。如果您使用-r命令出错,请尝试删除{{1}}选项。