Windows: копировать / перемещать файлы с регулярными выражениями имен файлов?

Я в основном хочу запускать:

C:\>xcopy [0-9]{13}\.(gif|jpg|png) s:\TargetFolder /s 

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

Я не могу узнать, как узнать, имеет ли PowerShell Cmdlet для копирования файлов; И если да, то как узнать, поддерживает ли оно соответствие имени файла регулярного выражения.

Может ли кто-нибудь подумать о способе выполнения рекурсивного копирования / перемещения файла с соответствием имени файла regex?

Мне нравится использовать все команды Powershell, когда смогу. После небольшого тестирования это лучшее, что я могу сделать.

 $source = "C:\test" $destination = "C:\test2" $filter = [regex] "^[0-9]{6}\.(jpg|gif)" $bin = Get-ChildItem -Path $source | Where-Object {$_.Name -match $filter} foreach ($item in $bin) {Copy-Item -Path $item.FullName -Destination $destination} 

Первые три строки просто упрощают чтение, вы можете определить переменные внутри фактических команд, если хотите. Ключом к этому образцу кода является команда «Where-Object», которая является фильтром, который принимает соответствие регулярных выражений. Следует отметить, что поддержка регулярных выражений немного странная. Я нашел здесь справочную карту PDF, в которой есть поддерживаемые символы слева.

[РЕДАКТИРОВАТЬ]

Как упоминал «@Johannes Rössel», вы также можете сократить две последние строки до одной строки.

 ((Get-ChildItem -Path $source) -match $filter) | Copy-Item -Destination $destination 

Главное отличие заключается в том, что метод Johannes делает фильтрацию объектов, и мой путь делает текстовую фильтрацию. При работе с Powershell почти всегда лучше использовать объекты.

[EDIT2]

Как упоминалось в @smoknheap, приведенные выше сценарии сгладят структуру папок и помещают все ваши файлы в одну папку. Я не уверен, есть ли переключатель, который сохраняет структуру папок. Я попробовал переключатель -Recurse, и это не помогает. Единственный способ, которым я получил это, – вернуться к обработке строк и добавить в свой фильтр папки.

 $bin = Get-ChildItem -Path $source -Recurse | Where-Object {($_.Name -match $filter) -or ($_.PSIsContainer)} foreach ($item in $bin) { Copy-Item -Path $item.FullName -Destination $item.FullName.ToString().Replace($source,$destination).Replace($item.Name,"") } 

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

[EDIT3]

Теперь, если вы хотите сообщить об этом пути, чтобы убедиться, что все правильно. Вы можете использовать команду «Write-Host». Вот код, который даст вам некоторые подсказки относительно того, что происходит.

 cls $source = "C:\test" $destination = "C:\test2" $filter = [regex] "^[0-9]{6}\.(jpg|gif)" $bin = Get-ChildItem -Path $source -Recurse | Where-Object {($_.Name -match $filter) -or ($_.PSIsContainer)} foreach ($item in $bin) { Write-Host " ---- Obj: $item Path: "$item.fullname" Destination: "$item.FullName.ToString().Replace($source,$destination).Replace($item.Name,"") Copy-Item -Path $item.FullName -Destination $item.FullName.ToString().Replace($source,$destination).Replace($item.Name,"") } 

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

Надеюсь это поможет

PowerShell – отличный инструмент для решения этой задачи. Командлет Copy-Item можно использовать для процесса копирования. Вы можете связать его с другими командлетами для сложных команд копирования, вот кто-то, кто сделал именно это 🙂

Регулярные выражения используют класс .NET RegEx из пространства имен System.Text.RegularExpressions, есть быстрый способ использования этого класса

В PowerShell также есть операторы -match и -replace, которые могут использоваться при конвейерной обработке с копией

Существуют также инструменты, которые помогут вам создать сам RegEx, например, приятель RegEx

Как идея, но нуждается в некоторой работе

Dir -r | ? {$ _ -match '[0-9] {13} \. (Gif | jpg | png)'} | % {Xcopy $ _. Fullname c: \ temp}

Давайте будем гением компьютера.