ファイルのバッチの名前変更が機能しません。

ファイルのバッチの名前変更が機能しません。

同様の質問がたくさん出ました。その虫がおそらく私の顔を狙っているのに、私はただ見ることができない…。

#!/bin/bash
declare -a files
shopt -s nullglob       
files=(*)
count=36   # offset

for oldfilename in "${files[@]}"; do
    (( count++ ))
#   newfilename=$(echo "$oldfilename" | sed -e "s/^[1-9][0-9]?\.jpg/Scount\.png/")
#   newfilename=${oldfilename/[1-9][0-9]?/Scount}
#   newfilename=${oldfilename/[1-9][0-9]?/"Scount"}
    newfilename=${oldfilename//[1-9][0-9]?/Scount}
    echo mv -fv /path1/to/"${oldfilename}" /path2/to/"${newfilename}"
done
exit 0

私はその行に注釈を付けようとしました。/との//違いを知りませんnewfilename=${oldfilename/[1-9][0-9]?/"Scount"}。 o_0?

編集する: で表されるファイルの$oldfilename形式1.jpgはです99.jpg。出力ファイルは$newfilename37.png〜135.pngの形式でなければなりません(少なくとも呼び出しに関する限りsed)。
どういうわけかファイル名が変更されず、ドットが消え.jpgました。なぜこれがうまくいかないのですか?

答え1

sed私はあなたがregex:を一致させて置き換えたいあなたの(コメント付き)コマンド[1-9][0-9]?から推測しています。

  • 0以外の数字([1-9])の後に
  • 0または1桁([0-9]?

これは、1から99の整数(前にゼロが付いていない)に対して機能する非常に一般的な正規表現です。ただし、正規表現を使用する代わりに、パス名拡張パターン(ワイルドカードとも呼ばれます)を使用します。だからその意味は${parameter/pattern/string}[1-9][0-9]?

  • 0以外の数字([1-9])の後に
  • 数字([0-9])、その後に
  • 任意の文字( ?)

それでも2桁のファイル名には機能しますが(なしで)使用し、名前を.変更します。10.jpg46jpg.


質問の他の部分については、次の //項目をすべて置き換えてください。模様/最初のものだけを置き換えます。例えば、

$ i=cataract
$ echo "${i/a/X}"
cXtaract
$ echo "${i//a/X}"
cXtXrXct

答え2

renamePerl(時にはPerlとも呼ばれる)がある場合は、prename次のことができます。

rename -v 's!(\d+)(.*)\.jpg$!sprintf "%d%s.png", $1+36, $2!e' *.jpg

これは各ファイル名を取得し、先頭の数字、ファイル名コンポーネントの残りの部分、および末尾の数字を分割します.jpg。次に、数値部分に36を追加し、元のファイル名の残りの部分を追加し、サフィックスを.png

rename -n ...このアイテムの内容を変更すると、何が起こるかを確認または削除して-v自動的に実行することができます。

関連情報