Ещё один кирпичик кода в виде заметки для себя. Думаю, что у каждого есть тот или иной способ бороться с бессмысленно растиражированными копиями файлов. Сразу можно подумать про контрольные суммы и прочую магию (уже было), но сегодня всё более прозаично.
Сегодня пробуем очистить папку от бездумных копий, когда целую кучу файлов по какой-то случайности превратили в ещё одну кучу файлов, а потом ещё и ещё…
Я про ситуацию, когда условный 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: Магия всего этого поста бесполезна, если в имени изначальных файлов будут встречаться цифры в скобках. Тогда в выборку попадёт вообще всё: и копии, и не копии, и соседские санки, и старый холодильник на балконе. Вселенная схлопнется, а папка очиститься настолько, что вспомнит динозавров. В общем, помним про дисклеймер и всё сначала тестируем в песочнице.