回答編集履歴

3 追記

yureighost

yureighost score 2169

2020/08/21 07:35  投稿

コマンドプロンプトバッチは手間がかかる割にできることが少ないです。
今のWindowsならPowershellが使えますので、そちらを使うことをお勧めします。
powershellでリネームしたいファイルのあるディレクトリパスに移動して
```powershell
Get-ChildItem -Name | rename-item -NewName { $_ -replace '([^_]+)(?:_bk)+','$1' }
```
これを実行していただければリネームできるはずです。
**追記**
そのエラーはリネーム前と後が同じ名前を指定すると出るエラーです。
置換処理を入れても名前が変わらないファイルがあったってことですね。
そしてディレクトリを再帰的に処理するコマンドはこれです。
-Recurseの前にディレクトリ名を入れていただければそこから、
無指定ならpowershellの現在のディレクトリから、
再帰的に配下のサブディレクトリ内のファイルのみをリネームします。
 
**再追記**  
ikadzuchiさんご指摘ありがとうございます。  
正規表現に問題がありますね。  
とりあえず例で挙げられてるのだけ処理できるように書いたので。  
具体的には一番右のピリオドより右のアンダースコアより右の文字を切り捨てる。  
という正規表現に修正しました。  
これならば  
test.test_bk_test.txt_bk2_bk_bn → test.test_bk_test.txt  
こういう置換ができます。  
```powershell
Get-ChildItem -Recurse * | ? { ! $_.PSIsContainer } | rename-item -NewName { $_.name -replace '([^_]+)(?:_bk)+','$1' }
Get-ChildItem renamefile -Recurse * | ? { ! $_.PSIsContainer } | rename-item -NewName { $_.name -replace '(.+\.[^_]+)_.+','$1' }
```
2 誤字の修正

yureighost

yureighost score 2169

2020/08/20 19:37  投稿

コマンドプロンプトバッチは手間がかかる割にできることが少ないです。
今のWindowsならPowershellが使えますので、そちらを使うことをお勧めします。
powershellでリネームしたいファイルのあるディレクトリパスに移動して
```powershell
Get-ChildItem -Name | rename-item -NewName { $_ -replace '([^_]+)(?:_bk)+','$1' }
```
これを実行していただければリネームできるはずです。
**追記**
そのエラーはリネーム前と後が同じ名前を指定すると出るエラーです。
置換処理を入れても名前が変わらないファイルがあったってことですね。
そしてディレクトリを再帰的に処理するコマンドはこれです。
-Recurseの前にディレクトリ名を入れていただければそこから、
無指定ならpowershellの現在のディレクトリから、
再帰的に配下のサブディレクトリ内のファイルのみをリネームします。
```python
```powershell
Get-ChildItem -Recurse * | ? { ! $_.PSIsContainer } | rename-item -NewName { $_.name -replace '([^_]+)(?:_bk)+','$1' }
```
1 追記

yureighost

yureighost score 2169

2020/08/20 19:09  投稿

コマンドプロンプトバッチは手間がかかる割にできることが少ないです。
今のWindowsならPowershellが使えますので、そちらを使うことをお勧めします。
powershellでリネームしたいファイルのあるディレクトリパスに移動して
```powershell
Get-ChildItem -Name | rename-item -NewName { $_ -replace '([^_]+)(?:_bk)+','$1' }
```
これを実行していただければリネームできるはずです。
これを実行していただければリネームできるはずです。
**追記**
そのエラーはリネーム前と後が同じ名前を指定すると出るエラーです。
置換処理を入れても名前が変わらないファイルがあったってことですね。
そしてディレクトリを再帰的に処理するコマンドはこれです。
-Recurseの前にディレクトリ名を入れていただければそこから、
無指定ならpowershellの現在のディレクトリから、
再帰的に配下のサブディレクトリ内のファイルのみをリネームします。
```python
Get-ChildItem -Recurse * | ? { ! $_.PSIsContainer } | rename-item -NewName { $_.name -replace '([^_]+)(?:_bk)+','$1' }
```

思考するエンジニアのためのQ&Aサイト「teratail」について詳しく知る