ファイル名をまとめて変更したいです
A-B-C#2-D.wav
。A-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つの部分に分割します。
^([^[:digit:]]+)
——入門部分まで。しかし含まれていません最初の数字([[:digit:]]+)
- 数字(-.\.wav)
- 末尾の部分
一致に成功したら、前半、数字から1を引いた部分、後半を使用してファイル名を変更します。
echo
出力が正しく表示されたら削除します。