Более быстрая альтернатива Get-ChildItem -Recurse - PullRequest
0 голосов
/ 26 марта 2012

У меня есть скрипт, который использует Get-ChildItem для поиска определенных файлов в каталоге.Затем я использую две разные таблицы SQL для сравнения этих файлов с ограничениями и удаляю файлы, если они соответствуют определенным критериям.

По сути, так и происходит:

- Для справки -include $ includeПеременная - это уникальный идентификатор (строка), используемый в качестве имени файла.Я удаляю все файлы, похожие на это имя.

Пример:

$include: 9d3aa8ee-e60e-4b4f-9cd0-6678f8a5549e*.*

Запрос к таблице № 1, результаты помещаются в массив.Запросите таблицу # 2, поместите результаты в массив.

~~~ Код Psuedo ~~~

    foreach ($i in table #1) {
        foreach ($x in table #2) {

            if (constraints are met) {
                $files = Get-ChildItem -Path $path  -Recurse -include $include | foreach-object -process { $_.FullName }

                Delete the files
            }
        }
    }

Моя проблема: на 14 000 файловэтот сервер.Я запустил сценарий на тестовом сервере с примерно 1,5 миллионами файлов, и это занимает почти два часа.

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

Как я могу это сделать?

Ответы [ 4 ]

1 голос
/ 05 апреля 2012

Ну, я не знаю, что вы подразумеваете под некоторыми ограничениями.Но пару лет назад я написал командлет Find-ChildItem, который является альтернативой Get-ChildItem.

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

Подробнее об этом командлете Find-ChildItem можно узнать в моем блоге, Unix / Linux найти эквивалент в командлете Powershell Find-ChildItem .

Некоторые опции Find-ChildItem

  1. Find-ChildItem -Type f -Name ". *. Exe"
  2. Find-ChildItem -Typef -Name ".c $" -Exec "Get-Content {} | Measure-Object -Line -Character -Word"
  3. Find-ChildItem -Type f -Empty
  4. Find-ChildItem-Тип f -Empty -OutObject
  5. Find-ChildItem -Type f -Empty -Delete
  6. Find-ChildItem -Type f -Size + 9M -Delete
  7. Find-ChildItem-Тип d
  8. Find-ChildItem -Тип f -Размер + 50m -WTime +5 -MaxDepth 1 -Delete

Надеюсь, это вам немного поможет ...

1 голос
/ 26 марта 2012

Для получения только строк полного имени из больших структур каталогов устаревшая команда DIR с ключом / B может быть намного быстрее:

cmd /c dir $path\9d3aa8ee-e60e-4b4f-9cd0-6678f8a5549e*.* /b /s /a-d
1 голос
/ 26 марта 2012

Если я буду следовать за вами, вы будете использовать огромную директорию для каждого шаблона файла, который хотите удалить.Если это так, то я сначала найду все шаблоны и только потом использую один вызов Get-ChildItem для удаления файлов.

$include = foreach( $i in table #1 ) 
{
    foreach( $x in table #2 ) 
    {    
       if(constraints are met) 
       {
           output file pattern
       }    

    }
}

Get-ChildItem -Path $path -Recurse -Include $include| Remove-Item -Force
0 голосов
/ 27 марта 2012

С 14 миллионами файлов, сколько нужно времени, чтобы найти один такой файл?

Возможно, вы просто боретесь с подсистемой ввода-вывода, и выбор сценария может не иметь большого значения.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...