• 締切済み

一括で、画像のファイル名の頭4文字を削除したい

一括で、画像のファイル名の頭4文字を削除したいと思っています。 拡張子はJPGになります。 現在、コマンドプロンプトで、下記のようにコマンドを作っていますが、 プログラムが不慣れで、どこが、間違っているのかが、 ご教授いただけますでしょうか。 for %F in (*) do ren "%F" "%~nF" for %F in (*) do ren "%F" "%F"

みんなの回答

  • luka3
  • ベストアンサー率72% (424/583)
回答No.7

すでに解決済のようですが、原因はリネーム後のファイルが再度FORに引っかかったということではないでしょうか。 リネームあるあるです。 1234ABCDE.JPG ⇒ ABCDE.JPG ⇒ E.JPG 自分なら別のフォルダに移動させて回避、とかでしょうか。 MOVE "%FN%" "NEWFOLDER\%NEW%"

回答No.6

Batファイルならluka3さんの回答のコーディングで多分タイプ漏れで気が付かれたかもしれませんが最後にサブルーチンからメインに戻る goto :EOF を付加しても同じように最初のファイルが二回4文字、計8文字削られます。 forの(*.jpg) 等で名前を変更すると変更後もjpgなので(*.jpg)の対象と言えば対象ファイルです。なぜ、最初のファイルだけかは作った人に聞かないとわかりません。 避けるたまには「拡張子を一時的に対象外にする」または「リネイム後に隠し属性を付加して二度目の処理を避ける」しかないと思います。 ファイル名拡張子を一旦、.jpgなどを.xxjとかにリネイムし明らかに対象から外し最後に「ren "*.xxj" "*.jpg"」で本来の拡張子に戻すかあるいは、隠し属性を補足欄の「 ren "%%F" "!tempname!"」のあとに「 attrib +h !tempname!」の一行を入れforの終わった後に「attrib -h *.*」或いは「attrib -h *.jpg」「attrib -h *.png」…で元に戻すかでしょうか?

  • luka3
  • ベストアンサー率72% (424/583)
回答No.5

すでにいくつか出ていますが、バッチファイルでも出来るという例です。 拡張子 .bat でリネームしたいフォルダに保存・実行してください。 FOR %%F IN (*.JPG) DO CALL :REN4 "%%~F" PAUSE EXIT /B :REN4 SET "FN=%~1" SET "NEW=%FN:~4%" REN "%FN%" "%NEW%"

s52i4z9
質問者

補足

画像ファイルで、先頭4文字のファイル名を削除するバッチで作成しています。 ほぼ、うまく動いているのですが、 1つ目の画像ファイルだけが、8文字削除されてしまいます。 どこが間違えているのかが分からなくて、 ご教授いただけますでしょうか。 よろしくお願いいたします。 @echo off setlocal enabledelayedexpansion for %%F in (*.jpg *.png *.gif *.bmp) do ( set "filename=%%~nF" set "extension=%%~xF" rem ファイル名が4文字以上の場合にのみ先頭4文字を削除 if "!filename:~4!" neq "" ( set "tempname=!filename:~4!!extension!" rem ファイル名が元の名前と異なる場合のみリネーム if not "!tempname!"=="%%F" ( ren "%%F" "!tempname!" ) ) else ( echo ファイル名が短すぎて変更できません: "%%F" ) ) endlocal

  • UY-Scuti
  • ベストアンサー率85% (17/20)
回答No.4

powershell -c "ls *.jpg | ren -new {$_.Name -replace '^.{4}'}"

回答No.3

コマンドプロンプトではなく、画面左下の虫眼鏡アイコンで「PowerShell」を検索して、開いたウィンドウで実行してください。

回答No.2

for %F in (*) do ren "%F" "%~nF" これは拡張子を削除しています。 for %F in (*) do ren "%F" "%F" これは同じ名前に rename なので意味がないですね。 なお、コマンドプロンプトで部分文字列を取得することはできるようです。 https://qiita.com/omaenimutyuu/items/934b2d57e6c93bb93450 ただし、for で回そうとするとうまくいかないようです。 PowerShell なら、対象のファイル名の拡張子が JPG だとして Get-ChildItem | Where-Object {$_.Extension -eq '.JPG'} | Rename-Item -NewName {$_.Name.Substring(4)} とすれば先頭4文字を削除することができます。

s52i4z9
質問者

補足

回答有難うございます。 試したのですが、下記のエラーメッセージが返ってきます 。初心者で、意味が分からないので、お教えいただけますでしょうか。よろしくお願いいたします。 'Get-ChildItem' は、内部コマンドまたは外部コマンド、 操作可能なプログラムまたはバッチ ファイルとして認識されていません。

  • asciiz
  • ベストアンサー率70% (6803/9674)
回答No.1

コマンドプロンプトにファイル名何文字目みたいな書式設定はないので、バッチファイルでやるのは無理があると思います。 Windowsに最初から入ってる PowerShell ならインストールの必要もなく実行できると思うんですが、PowerShell書き慣れてなくて私が書くとえらく非効率になってしまいそうで…。 一回だけ実行するのであれば、 dir /b *.jpg >jpeglist.txt として取得したファイルリストをExcelに読み込んで、リネームコマンドに変換したやつを保存して、実行するとか。 Perlなら以下のようにできました。 ----rename.pl---- my @file = glob "*.jpg"; while ($file[0] ne "") { my $newname = $file[0]; $newname =~ s/....(.*\.jpg)$/$1/i; rename $file[0], $newname; shift @file; } ----ここまで---- これをコマンドラインから perl rename.pl として実行します。 まあその前にperlインストールしないといけませんが。

関連するQ&A