web-dev-qa-db-ja.com

WindowsCMD-すべてのサブフォルダー内のすべてのファイルの名前を親フォルダー名に変更する方法

よし、スクリプター、

私はまだFORコマンドに頭を包み込もうとしています。私がやりたいのは、すべてのサブフォルダー内のすべてのファイルの名前を、それらが存在するフォルダー名に変更し、拡張子を保持することです。私はそれが次のようなもので行うことができると想像します:

   For /R %X in (*.*) do REN %X <argument for parent folder name>

たぶん私は間違っています。これを行う正しい方法は何ですか?そしてそれはスクリプトでなければなりません。 Bulk RenameUtilityやFileRenamerDeluxeなどについて質問していません。

御時間ありがとうございます!

1
Heatseeker86

各フォルダに特定のタイプのファイルが複数存在しない場合にのみ、指定した目標を達成できます。異常な状況がない限り、それは合理的な期待ではありません。

ただし、すべてのファイルの前に親フォルダーの名前を挿入することは可能です。
"fileName.ext" --> "parentFolderName_fileName.ext"

FOR /Rコマンドは、ルートツリー内のすべてのフォルダーのフォルダーパスを繰り返すことができます。

DIR /B /A-D "folderPath"コマンドは、フォルダー内のすべてのファイルを一覧表示できます。ただし、すでに親フォルダー名で始まるファイルの名前を変更したくない場合は、FINDSTRにパイプして、すでに名前が変更されているファイルを除外できます。

パイプされたコマンドの結果は、FOR/Fで繰り返すことができます。 EOLおよびDELIMSオプションは、すべてのファイルのフルネームが保持されていることを確認するために使用されます。

%%~nxDは、親フォルダーのフォルダー名と拡張子のみを返します。

すべてをまとめると、次の長い1つのライナーをコマンドラインで直接使用できます。現在のディレクトリをルートとするツリーを処理します。

for /r %D in (.) do @for /f "eol=: delims=" %F in ('dir /b /a-d "%D" 2^>nul^|findstr /vbic:"%~nxD_"') do ren "%D\%F" "%~nxD_%F"

コマンドをスクリプトに入れて、処理するルートフォルダーを引数として渡すことができます。引数が指定されていない場合、スクリプトは現在のディレクトリから処理を開始します。引数が指定されている場合、その値がルートフォルダとして使用されます。

@for /r %1 %%D in (.) do @for /f "eol=: delims=" %%F in (
  'dir /b /a-d "%%D" 2^>nul^|findstr /vbic:"%%~nxD_"'
) do ren "%%D\%%F" "%%~nxD_%%F"

My JREN.BAT正規表現名前変更ユーティリティ を使用すると、コードが簡単になります。これは、XP以降の任意のWindowsマシンでネイティブに実行される純粋なスクリプト(ハイブリッドバッチ/ JScript)です。サードパーティのexeファイルは必要ありません。

完全なドキュメントはユーティリティに埋め込まれています-jren /?、またはページ出力が必要な場合はjren /??からアクセスします。

次の簡単なコマンドは、現在のディレクトリをルートとするツリーを処理します。

for /r %F in (.) do @call jren "^" "%~nxF_" /p "%F" /fx "%~nxF_*"

最初の2つのJREN引数は、検索/置換文字列です。検索はファイル名の先頭に一致し、置換は親フォルダー名を(末尾にアンダースコアを付けて)挿入するだけです。 /P "%F"オプションは、ルートフォルダーを指定します。また、/FX "%~nxF_*オプションは、親フォルダーの名前で始まり、その後にアンダースコアが続くファイルを除外します。

このコマンドは、オプションのルートフォルダーを引数として受け入れるバッチスクリプトに入れることができます(値が指定されていない場合は現在のディレクトリを処理します)。

@echo off
for /r %1 %%F in (.) do call jren "^" "%%~nxF_" /p "%%F" /fx "%%~nxF_*"
2
dbenham

*.batとして保存

 @ echo off 
 for/r %% D in(。)do(
 for/f "delims =" %% F in( 'dir/b/A:- D "%% D" ')do echo "%% D\%% F" "%% 〜nxD %% 〜xF" 
)
 @ echo off 
 for/r %% F in(*)do(
 for/f "delims =" %% D in( "%% 〜dpF。")エコー "%% F" "%% 〜nxD %% 〜xF" 
)

echorenに置き換える前に、これが必要なものであることを確認してください。

参照:
For-ループコマンド
パラメータ拡張

0
guest-vm