Сделать имя папки таким же, как имена файлов

Сделать имя папки таким же, как имена файлов
Сделать имя папки таким же, как имена файлов - mattartz @ Unsplash

У меня есть структура каталогов, как показано ниже:

Folder
    > FileName1.abc
    > Filename2.abc
    > .............

Folder2
    > FileName11.abc
    > Filename12.abc
    > ..............

> ..........

и т.д. У меня есть команда, которая может добавлять имена папок к именам файлов.

Образец:

Folder1_Filename1.abc
Folder1_Filename2.abc

Я хочу изменить это следующим образом.

Сделать имя папки таким же, как имена файлов:

Folder1.abc
Folder1 (1).abc
Folder2.xyz
Folder2 (1).xyz

Т.е. В результате я хочу заменить имена файлов на имя папки. Если есть файлы с разными именами с одинаковым расширением, они могут добавить (1), (2) в конец имен.

Сценарий:


@echo off
pushd "Folder"
for /d %%D in (*) do (
  pushd "%%D"
  for /r %%F in (*) do (
    for %%P in ("%%F\..") do (
      ren "%%F" "%%~nxP_%%~nxF"
    )
  )
  popd
)
popd

Приведенная выше команда не делает того, что я хочу.

Эта команда просто добавляет имя папки в начало имен файлов.


PS: Я изменил команду "%%~nxP_%%~nxF" на "%%~nxP%%~xF" command. И я почти выполнил то, что хотел. Но в один момент я увидел, что только 1 из файлов с одинаковым расширением изменил свое имя. Я искал команду, которая может добавить (1), (2), (3) при сохранении имен файлов с одинаковым расширением; но я не смог найти ее.

Подробный пример:


Folder
    > Folder.jpg
    > Folder (1).jpg
    > Folder (2).jpg
    > .............

Я буду благодарен, если вы знаете команду, которая может сделать то, что я хочу, кроме вышеупомянутой команды.

Вы заслуживаете благодарности.

Насколько я могу судить, это то, что вы хотите.

В опубликованном коде операторы Rename-Item включают параметр -WhatIf, поэтому его можно смело запускать для получения образцовых результатов, но не для реального выполнения действия. Если примерный результат является желаемым, удалите параметр -WhatIf из обоих операторов Rename-Item и запустите код заново.

Для нескольких файлов с одинаковым расширением код упрощается добавлением числовых суффиксов ко всем файлам, начиная нумерацию с 0. Это позволяет применить одно утверждение/шаблон ко всем файлам.

Перед выполнением отредактируйте оператор $TopFolder assignemnt, чтобы он отражал действительный путь.

$TopFolder    = '<Path to "Folder">'
Get-ChildItem $TopFolder -Directory | ForEach-Object{
    Get-ChildItem $_.FullName -File | Group-Object Extension | ForEach-Object{
        If ( $_.Count -eq 1 )
        {
            $_.Group[0] | Rename-Item -NewName { $_.Directory.Name + $_.Extension} -WhatIf
        }
        Else
        {
            $NameTemplate = $_.Group[0].Directory.Name + ' ({0})' + $_.Name
            For ( $i = 0 ; $i -lt $_.Count ; $i++ ) {
                $_.Group[$i] | Rename-Item -NewName ( $NameTemplate -f $i ) -WhatIf
            }
        }
    }
}

ForEach-Object

For Loop

Группа-объект

-f Оператор формата


NevaDev, 5 февраля 2023 г., 16:51