Переименуйте все папки в каталоге в один ди git или символ с помощью Powershell - PullRequest
1 голос
/ 24 января 2020

У меня есть каталог в Windows 10, где все файлы имеют имена, которые слишком длинны для обработки windows. Я хочу удалить эти файлы.

Я обнаружил, что переименование папки позволяет мне уменьшить путь, достаточный для удаления папки. Например, изменив «Рабочий стол» и его подпапки на «1» (поэтому путь равен 1/1/1/1 / file.filetype)

То, что я пробовал:

Get-ChildItem $path -Recurse -Filter * | Rename-Item -NewName { $_.name -replace *, '1'} -verbose

Однако, кажется, это приводит к ошибке. * Есть ли простой способ сделать это или что я могу изменить?

Редактировать:

Dir | %{Rename-Item $_ -NewName ("{0}" -f $nr++)} 

Работает на одном уровне, но у меня возникли проблемы при рекурсивном выполнении дочерних папок

Get-ChildItem $path -Recurse |  %{Rename-Item $_ -NewName ("{0}" -f $nr++)}

эта ошибка выдает среди прочих: Rename-Item: невозможно переименовать, поскольку элемент в 'designable.nib' не существует.

Ответы [ 2 ]

3 голосов
/ 24 января 2020

Если вы знаете, что ничего не потеряете, переименовав все папки, это поможет. Это не меняет имена файлов. Это будет рекурсивно вызывать метод для переименования папки, пока процесс не сможет найти следующий номер.

ПРИМЕЧАНИЕ: Если вы уберете -Directory, он также обновит имена файлов .

function RenameToLeastNumbers ($item, $number) {
  try {
    $newName = $item.Name -replace $item.Name, $number
    Rename-Item $item.FullName -NewName $newName -ErrorAction Stop
  }
  catch 
  {
    $number = $number + 1
    if ($number -gt 100) {
      return
    }
    RenameToLeastNumbers $item $number
  }
}

Get-ChildItem -Directory -Recurse -Path C:\Temp\Dates | % { RenameToLeastNumbers $_ 1 }

Все папки в разделе Даты будут переименованы, начиная с 1. Если у Даты есть три папки, они будут переименованы в 1, 2, 3. То же самое будет происходить с каждым из их дочерних элементов и т. Д.

как выглядят папки

dir C:\temp\Dates -Name -Recurse

1
2
3
1\1
1\1\This is a text document.txt
2\1
3\1
0 голосов
/ 25 января 2020

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

function RenameFolderAndSubFolders {
  param($item, $number)
  $subfolders = Get-ChildItem $item.FullName -Directory

  foreach ($folder in $subfolders) {
    RenameFolderAndSubFolders $folder 1
  }

  while ($true){
        try {
            Write-Output "Renaming: $($item.FullName)"
            Rename-Item $item.FullName -NewName $number -ErrorAction Stop
            return
        }
        catch {}
        $number = $number + 1
    }
}

Get-ChildItem -Directory -Path C:\Temp\Dates | % { RenameFolderAndSubFolders -item $_ -number 1 }

Дайте мне знать, как это работает.

...