複数のファイルの名前を変更するコードは次のとおりです。
#!/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パラメータが同じで、より多くのファイルがあっても最初のファイルで停止するため、名前は変更されません。*.jpg
)jpg
andの代わりにbashスクリプトにandを手動で入力すると機能します。bak
$2
$3
答え1
以下を使用してスクリプトを呼び出します。
./script file_*.jpg jpg bak
ただし、*
スクリプトに渡される前に拡張されます。 filesがあり、file_1.jpg
フォルダに次のものがあるとしますfile_2.jpg
。file_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