Bash:区切り文字から1を引いた部分文字列に分割される

Bash:区切り文字から1を引いた部分文字列に分割される

ファイル名をまとめて変更したいです A-B-C#2-D.wavA-B-C#1-D.wavたとえば、次のようになります。

A-B-C#2-D.wav
A-B-C#8-G.wav
A-B-C6-E.wav

~になる

A-B-C#1-D.wav
A-B-C#7-G.wav
A-B-C5-E.wav

したがって、3番目の部分文字列の数字はマイナス1でなければなりません。 (#コメントではないファイル名の一部;#ファイル名があるかどうかは可能です。)

答え1

そしてzsh

autoload zmv # best in ~/.zshrc
zmv -n '(*[^0-9])(<1->)(*.wav)(#qn)' '$1$(($2-1))$3'

(満足すれば削除-n

名前を変更する(#qn)ために、リストを番号順にソートするために使用されます。A-B-C#9-D.wav今後 A-B-C#10-D.wav例えば。

ただし、aA-B-C#9-D.wavと両方がA-B-C#10-D.wav存在する場合zmv、ファイル名は既存のファイル名に変更されたとマークされ、コマンドは中断されます。-fこれを引き続き適用するには、オプションを追加する必要があります。

または、zsh(数値グローバル順序の場合)とperl名前変更を使用します。

rename -n 's/\d+/$&-1/e' ./*[1-9]*.wav(#qn)

-f(一部のバリエーションと同じ警告とオプションrename

答え2

bash関連ループの使用(正規表現テスト条件の場合=~):

for file in ?-?-*-?.wav
do
  [[ $file =~ ^([^[:digit:]]+)([[:digit:]]+)(-.\.wav)$ ]] &&
    echo mv -- "$file" "${BASH_REMATCH[1]}$((10#${BASH_REMATCH[2]} - 1))${BASH_REMATCH[3]}"
done

ワイルドカードを使用して必要なwavファイルを選択します。一致するファイルには、.wavダッシュの間と末尾の前に文字(文字)が1つあります。各ファイル名は正規表現で実行され、それらを3つの部分に分割します。

  1. ^([^[:digit:]]+)——入門部分まで。しかし含まれていません最初の数字
  2. ([[:digit:]]+)- 数字
  3. (-.\.wav)- 末尾の部分

一致に成功したら、前半、数字から1を引いた部分、後半を使用してファイル名を変更します。

echo出力が正しく表示されたら削除します。

関連情報