Хорошо, на самом деле это довольно просто в cmd.
Но давайте сделаем еще один шаг вместо того, чтобы все в одном, вставим оба в два.
Также я бы предложилзапустив журнал того, что будет сначала переименовано для просмотра, и / или скопировав файлы в 3-й каталог для проверки, чтобы убедиться, что вы получили желаемые результаты.
Так как вы не знакомы с cmd / пакетными сценариямиХочу заметить, что у нас есть несколько вариантов итерации файлов, наиболее удобные for,
for/F
и Forfiles
- обычное средство для циклического перемещения файлов, иногда с DIR
cmd вfor /F
в качестве альтернативы со списком файлов WMIC
(хотя, к счастью, WMIC, наконец, становится более ограниченным в пользу Powershell).
Если вы хотите просто предположить, что каждый файл будет правильным на основе совпадения размеров и размеровточно и не дублируются, и вы в этом достаточно уверены, тогда использование dir
cmd для сортировки по размеру будет прагматичным методом быстрого сопоставления
Если большеeds, которые должны быть сделаны при сопоставлении, тогда цикл for
или forfiles
был бы лучшей альтернативой
Чтобы сэкономить место в этом процессе, вместо копирования мы можем создать жесткие ссылки, затем вы можете проверить их работу,при условии, что они это делают, вы можете удалить жесткие ссылки и использовать команду Move, чтобы переименовать их.
@(
SetLocal EnableDelayedExpansion
Echo off
Set "_Src=C:\Ren\Lost"
Set "_Ref=C:\Ren\Reference"
Set "_Lnk=C:\Ren\Hard_Linked"
Set "_Dst=C:\Ren\Renamed"
Set "_Log=C:\Ren\Rename.log"
)
Set "_J=0"
For /F "Tokens=*" %%A in ('
Dir /A-D /B /OSE "%_Src%"
') Do (
Set "_SrcFile!_J!=%%A"
Set /A "_J+=1"
)
Set "_I=0"
For /F "Tokens=*" %%A in ('
Dir /A-D /B /OSE "%_Ref%"
') Do (
Call ECHO.Rename: "%%_SrcFile!_I!%%" - To: "%%A"
Call ECHO.Rename: "%%_SrcFile!_I!%%" - To: "%%A">>"%_Log%"
REM Comment the next line to stop maiing hardlinks
CALL MkLink /H "%_Lnk%\%%A" "%_Src%\%%_SrcFile!_I!%%"
REM Un-comment the next line to move files to final folder renamed
REM CALL MOVE /Y "%_Src%\%%_SrcFile!_I!%%" "%_Dst%\%%A"
Set /A "_I+=1"
)
(
Endlocal
Exit /b
)
Я объясню это немного позже, но придется выполнить атм.
У меня была возможность вернуться к объявлению, хотя я сейчас не могу тратить время на объяснения из-за напряженного рабочего дня. Я исправил одну ошибку, добавив Set /A "_I+=1"
, из-за чего значение теста не увеличилось.файл каждый раз.
Вот пример вывода, поскольку у меня было время запустить его, чтобы убедиться, что он работает, и он работает точно так, как ожидалось для меня.
Y:\>C:\Ren\RenameScript.cmd
Rename: "SomethingOld.ext1" - To: "ReferenceFileCorect_A_Unique1.ext1"
Hardlink created for C:\Ren\Hard_Linked\ReferenceFileCorect_A_Unique1.ext1 <<===>> C:\Ren\Lost\SomethingOld.ext1
Rename: "SomethingOld.txt" - To: "ReferenceFileCorect_A_New_name.txt"
Hardlink created for C:\Ren\Hard_Linked\ReferenceFileCorect_A_New_name.txt <<===>> C:\Ren\Lost\SomethingOld.txt
Rename: "SomethingOld3.txt" - To: "ReferenceFileCorect_A_ThirdName.txt"
Hardlink created for C:\Ren\Hard_Linked\ReferenceFileCorect_A_ThirdName.txt <<===>> C:\Ren\Lost\SomethingOld3.txt
Это сообщение: Hardlink created for C:\Ren\Hard_Linked\ReferenceFileCorect_A_Unique1.ext1 <<===>> C:\Ren\Lost\SomethingOld.ext1
- это вывод MKLink, если вы не видите этого в приглашении CMD, то, скорее всего, вы не запустили сценарий CMD в административном приглашении cmd.
Мы можем добавить код в сценарий для вызоваPowerShell и перезапустите себя вадминистративный запрос cmd, но он будет менее мутным, если вы сделаете это непосредственно для тестирования, поскольку это не является частью вашего исходного Q.
Так что я хотел бы потратить минуту, чтобы объяснить, что такое сценарийделаю и почему для вас, так что вы можете идти вперед самостоятельно:
SetLocal EnableDelayedExpansion
Мы включаем Delayed Expansion, чтобы мы могли легко оценить содержимое переменных внутри цикла for, ссылаясь на них с помощью !_var!
вместо %_Var%
, технически мы можем обойтись без этого, если в любом из ваших имен файлов есть !
, мы должны отключить это и немного переписать, если нет, то все нормально.
ECHO OFF
Я не позволяю скрипту отображать каждую строку, которую он делает, поэтому у нас меньше загроможденных выходных данных.
Установка переменных не требует пояснений
это позволяет нам легко зацикливать переменные иобновить их содержимое в цикле без использования CALL.
Set "_J=0"
For /F "Tokens=*" %%A in ('
Dir /A-D /B /OSE "%_Src%"
') Do (
Set "_SrcFile!_J!=%%A"
Set /A "_J+=1"
)
Здесь я использую DIR
, чтобы быстро отсортировать файлы по их размеру и расширению, aи вернуть только имена файлов.DIR делает это очень быстро, поэтому предпочтительно, если вы выполняете небольшую сортировку, а не сопоставляете файлы, используя сравнение IF позже.
Опция /A-D
игнорирует каталоги /B
будет выводить только имя файла (поскольку мы не выполняем рекурсивный анализ) /OSE
- /O
означает "Упорядочить по", параметры S
и E
сортируют по размеру, а затем по расширению файла, поэтому даже если два файла имеют одинаковый размер, если их расширение отличаетсяпорядок сортировки будет таким же.
Все это помещается в For /F
цикл, который является способом для анализа вывода команды, мы используем "Tokens=*"
, чтобы убедиться, что мы берем все не белыеВозвращаемое пространство и помещаем его в переменную.
В разделе DO ()
мы увеличиваем временную переменную _J
, а затем создаем псевдомассив в памяти, создавая переменные, которые используют значение _J
дляхранить значение каждого файла, возвращаемого командой DIR в цикл.Set "_SrcFile!_J!=%%A"
Set "_I=0"
For /F "Tokens=*" %%A in ('
Dir /A-D /B /OSE "%_Ref%"
') Do (
Call ECHO.Rename: "%%_SrcFile!_I!%%" - To: "%%A"
Call ECHO.Rename: "%%_SrcFile!_I!%%" - To: "%%A">>"%_Log%"
REM Comment the next line to stop maiing hardlinks
CALL MkLink /H "%_Lnk%\%%A" "%_Src%\%%_SrcFile!_I!%%"
REM Un-comment the next line to move files to final folder renamed
REM CALL MOVE /Y "%_Src%\%%_SrcFile!_I!%%" "%_Dst%\%%A"
Set /A "_I+=1"
)
Теперь мы снова зациклим вывод DIR
, на этот раз в справочном каталоге, и так как набор файлов такой же, порядок будет таким же, как процесс в первой итерации цикла, и будут возвращены только именабудет отличаться (т.е. именно то, что мы хотим).
В пределах DO ()
здесь мы получаем каждый результат от DIR
, отправляем его в CLI, выводим в журнал, используя перенаправление >>
, изатем создайте наши жесткие ссылки или переименуйте файлы, используя MOVE (если вы откомментируете строку, удалив «REM»)
(обратите внимание, если бы мы собирались отображать и регистрировать несколько строк, я бы использовал CALLподфункции, чтобы сделать это, чтобы не было повторяющихся строк, однако, поскольку я решил оставить все как есть только один раз
Поскольку порядок один и тот же, я знаю, чтоитерация, на которой мы работаем, нам не нужно выполнять какие-либо операции сравнения (медленные), пока мы уверены, что дупликов не существует.
Я решил создать здесь жесткие ссылки, потому что их будет почтинет перегреваd при их создании, и они позволяют вам проводить живые тесты, чтобы точно определить, как выглядят файлы, прежде чем перемещать их для переименования, что является лучшим из всех миров)
Запуск в аналогичныхситуации, в которых я находился, и работая вручную (в детстве), могу сказать, что хотел бы знать этот трюк 20 лет назад, чтобы сэкономить время и диск при тестировании файлов.
MKLINK
- этонаходка для такого рода вещей.Теперь у вас есть скорость операции MOVE, но вы можете воспользоваться преимуществами копии, чтобы избежать случайного переименования их и возникновения проблем в ваших реальных исходных файлах.
Если вы удовлетворены результатами,Вы можете удалить все жесткие ссылки, REM
из создания жестких ссылок и снять комментарий со строки MOVE, которая должна постоянно переименовывать их.Тогда просто убедитесь, что в конце удалите ваши справочные файлы, чтобы случайно не сохранить плохой файл, который вы хотите сохранить.
Это