1

ファイルがソース ディレクトリにアップロードされたことを検出するたびに、ある場所から別の場所にファイルを移動する 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 つの拡張子を持たないすべてのファイルは、そのまま移動されます。

ありがとう!

デイブ

4

3 に答える 3

3
if [[ "$F" =~ .JPEG\|jpg\|jpeg\|jpg ]];then 
   echo mv $F ${F%.*}.jpg
fi
于 2013-08-14T22:50:19.903 に答える
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を削除してみてください。-r

于 2013-08-15T08:03:25.950 に答える
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 ) &
于 2013-08-14T22:57:39.507 に答える