إعادة تسمية الملفات Recursive أسماء الملفات + مجلد مع ملف دفعي

StackOverflow https://stackoverflow.com/questions/717171

  •  23-08-2019
  •  | 
  •  

سؤال

أحب إنشاء ملف دفعي (WinXP CMD) الذي يمر بشكل متكرر عبر مجلد اختار ومجلدات فرعية وإعادة تسمية ملفات + مجلدات + مع القواعد التالية:

من جميع أسماء الملفات + الملفات، تحتاج جميع الأحرف الكبيرة "V" و "W" إلى استبدال رسائل "Y" و "z".

على سبيل المثال 11V0W يجب أن تصبح 11Y0Z.

أعتقد أنه ممكن مع / ص ولكن كيف؟ أعتقد أن هناك يجب أن يكون هناك روتين فرعي يسمى الذي يتحقق من كل حرف واحد تلو الآخر بالإضافة إلى العودية الأساسية مع for / r.

هل كانت مفيدة؟

المحلول

الدفعة التالية تفعل هذا لأسماء الملفات على الأقل. الدلائل صعبة بعض الشيء (على الأقل لم أستطع التوصل إلى حل غير لانهائي حتى الآن):

@echo off
setlocal enableextensions
for /r %%f in (*) do call :process "%%f"
endlocal
goto :eof

:process
pushd "%~dp1"
set fn=%~nx1
set fn=%fn:V=Y%
set fn=%fn:W=Z%
ren "%~nx1" "%fn%"
popd
goto :eof

ولكن من الناحية النظرية، لا ينبغي أن يكون من الصعب جدا إعادة تسليم دير إلى هذا.

نصائح أخرى

Tom، Fiddling حول النصي السابق الذي نشرته، إليك إحدى المعالجة جميع الملفات والدلائل الفرعية:

recurename.cmd. الدليل

@echo off
setlocal ENABLEDELAYEDEXPANSION
set Replaces="V=Y" "W=Z" "m=A"
set StartDir=%~dp1
call :RenameDirs "%StartDir:~0,-1%"
exit /b 0
:RenameDirs
    call :RenameFiles "%~1"
    for /f "delims=" %%d in ('dir /ad /b "%~1"2^>nul') do call :RenameDirs "%~1\%%~d"
    if "%~1"=="%StartDir:~0,-1%" exit /b 0
    set _pos=0
    set _dir=%~f1
    set _dir_orig=!_dir!
    :finddirName
        set /a _pos-=1
        call set _dir_pos=!!!_dir:~%_pos%,1!!!
        if not "%_dir_pos%"=="\" goto finddirName
        call set _origines=!!!_dir:~0,%_pos%!!!
        set /a _pos+=1
        call set _dir=!!!_dir:~%_pos%!!!
    for %%r in (%Replaces%) do call set _dir=!!!_dir:%%~r!!!
    if /i not "!_dir!"=="!_dir_orig!" echo move "%~1" "%_origines%\!_dir!"
    exit /b 0
:RenameFiles
    for /f "delims=" %%f in ('dir /a-d /b "%~1"2^>nul') do (
        set _file=%%~nf
        set _file_orig=!_file!
        for %%r in (%Replaces%) do call set _file=!!!_file:%%~r!!!
        if /i not "!_file!"=="!_file_orig!" echo ren "%~1\%%f" "%~1\!_file!%%~xf"
    )
    exit /b 0

___ملاحظات____
هذا هو البرنامج النصي غير المدمر، وإزالة صدى صوت من الأوامر الصحيحة من أجل إعادة تسمية أي ملف / دليل. فيصدى الانتقال و صدى رن)

تعيين يستبدل =: اضبط هذا المتغير على أي أزواج تحتاج إلى تغييره.

تعيين startdir =: أردت أن آمن، بطريقة أو بأخرى، واتخاذ المسار فقط منه. إذا تم تقديم ملفات كمعلمة، فسيتم معالجة دليل الحاوية بأكمله و Subdirs.

إذا "٪ ~ 1" == "٪ startdir: ~ 0، -1٪" الخروج / b 0: تم وضع هذا الخط لإيقاف دليل الوسيطة نفسه من معالجته. إذا كنت ترغب في ذلك، قم بإزالة هذا الخط.
إذا تم استدعاء البرنامج النصي، فقل، ج: temp, ، إزالة هذا الخط سيغير الاسم إلى C: Teap فى النهاية.

مع هذه شجرة الدليل:

.
├── 00v0w
│   ├── 12V0W
│   ├── 12d0w
│   └── 12v0d
├── 11V0W
├── 11d0w
└── 11v0d

هؤلاء رينامر الأوامر:

$ renamer --regex --find '[vV]' --replace 'Y' '**'
$ renamer --regex --find '[wW]' --replace 'Z' '**'

سوف تنتج هذا الناتج:

.
├── 00Y0Z
│   ├── 12Y0Z
│   ├── 12Y0d
│   └── 12d0Z
├── 11Y0Z
├── 11Y0d
└── 11d0Z
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top