ワイルドカードパターンと2つの追加パラメータを使用してスクリプトを呼び出すにはどうすればよいですか?

ワイルドカードパターンと2つの追加パラメータを使用してスクリプトを呼び出すにはどうすればよいですか?

複数のファイルの名前を変更するコードは次のとおりです。

#!/bin/bash
for file in $1
    do
        mv -i "${file}" "${file/pattern/replacement}"
    done

「pattern」と「replace」を$ 2と$ 3にどのように変更しますか?

このコードは機能しません:

#!/bin/bash
for file in $1
    do
        mv -i "${file}" "${file/$2/$3}"
    done

次の3つのパラメータを使用して名前を変更しようとしました。 (file_*.jpg jpg bak結果は*.jpgすべてのファイルの名前を*.bakファイルに変更する必要があります。)しかし、それがすることは次のとおりです。 (mv -i file_01.jpg file_01.jpgしたがって、両方のmvパラメータが同じで、より多くのファイルがあっても最初のファイルで停止するため、名前は変更されません。*.jpgjpgandの代わりにbashスクリプトにandを手動で入力すると機能します。bak$2$3

答え1

以下を使用してスクリプトを呼び出します。

./script file_*.jpg jpg bak

ただし、*スクリプトに渡される前に拡張されます。 filesがあり、file_1.jpgフォルダに次のものがあるとしますfile_2.jpgfile_3.jpg

./script file_1.jpg file_2.jpg file_3.jpg jpg bak

これは${1} = file_1.jpg${2} = file_2.jpgとを意味します${3} = file_3.jpg

${1} = jpg(あなたの例では)次のようにスクリプトを書く方が良いかもしれません${2} = bak。その後、これらの変数をスクリプトに保存して呼び出して削除し、shift 2次のコマンドを使用してすべての位置パラメータを繰り返すことができます。

for file; do
    # do something
done

答え2

@pfnueselと@Stéphane Chazelasのヒントに基づいて、私が思いついたコードは次のとおりです。

#!/bin/bash

preview="false"
found="false"

if [ $# -eq 0 ]; then
    echo "Syntax: ren [-p] expression replacement files..."
else
    if [ "$1" == "-p" ] || [ "$1" == "-P" ]; then
        preview="true"
        shift
    fi

    expression=$1
    replacement=$2
    shift 2

    for file; do
        if [ -f "$file" ]; then
            found="true"
            if [ "$preview" == "true" ]; then
                echo mv -i -- "${file}" "${file/$expression/$replacement}"
            else
                mv -i -- "${file}" "${file/$expression/$replacement}"
            fi
        fi
    done

    if [ "$found" != "true" ]; then
        echo >&2 "Couldn't find files with the specified wildcard"
        exit 1
    fi
fi

関連情報