Заметки · 28.08.2026

Копия от копии

Ещё один кирпичик кода в виде заметки для себя. Думаю, что у каждого есть тот или иной способ бороться с бессмысленно растиражированными копиями файлов. Сразу можно подумать про контрольные суммы и прочую магию (уже было), но сегодня всё более прозаично.

Сегодня пробуем очистить папку от бездумных копий, когда целую кучу файлов по какой-то случайности превратили в ещё одну кучу файлов, а потом ещё и ещё…

Я про ситуацию, когда условный file.jpg превратился в file (1).jpg или же в file — копия.jpg (сюда же можно отнести Копия file.jpg).

Для начала давайте определимся с папкой в которой творится копировальное безобразие и обозначим переменную $path:

$path = "C:\Files\Folder"

Следующий шаг — получение всего содержимого папки с помощью командлета Get-ChildItem. Всё содержимое обрабатываем с помощью перебора и смотрим встречается ли в имени файла конструкция (любое количество цифр). Если конструкция есть — удаляем файл:

$files = Get-ChildItem -Path $path
foreach ($file in $files)
{
    if ($file.FullName -match "\(\d+\)")
    { Remove-Item $file.FullName }   
}

Особое внимание прошу обратить на эту конструкцию:

$file.FullName -match "\(\d+\)"

Этот код ищет в имени файла подстроку с регулярным выражением d+ — число и квантификатор, а символ \ нужен для экранирования.

С удалением файлов, в именах которых встречается слово копия всё ещё проще:

$files = Get-ChildItem -Path $path
foreach ($file in $files)
{
    if ($file.FullName -match "копия")
    { Remove-Item $file.FullName }   
}

Кстати, если использовать командлет Get-ChildItem с параметром Recurse можно пройтись по всем подпапкам пути из переменной $path.

UPD: Магия всего этого поста бесполезна, если в имени изначальных файлов будут встречаться цифры в скобках. Тогда в выборку попадёт вообще всё: и копии, и не копии, и соседские санки, и старый холодильник на балконе. Вселенная схлопнется, а папка очиститься настолько, что вспомнит динозавров. В общем, помним про дисклеймер и всё сначала тестируем в песочнице.