2

Из-за ошибки очень раздражающего человека тысячи моих файлов были скопированы, часто несколько раз. Это привело к появлению тысяч файлов с именами filename(2), filename(3) и т.д.

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

Я пробовал name:~ =(2), "(2)" и даже "(2)" "(2)" после поиска решений в другом месте. Никто из них не работал. Я хочу исключить файлы, которые имеют только 2 в имени файла, я ТОЛЬКО хочу файлы, которые имеют два в скобках.

Может кто-нибудь помочь, пожалуйста?

2 ответа2

3

Я только хочу файлы, которые имеют два в скобках (2)

Используйте следующее поисковое выражение:

name:~"*(2)*"

Заметки:

  • ~ является литеральным индикатором строки, и то, что следует, должно соответствовать всему имени файла

  • В зависимости от ваших потребностей filename: может быть лучше, чем name:

До:

После:


Дальнейшее чтение

0

Я предлагаю сценарий PowerShell, который:

  • находит все файлы с трейлингом (1) к BaseName рекурсивно для данной начальной папки.
  • Делает dir без номера, чтобы найти все возможные дубликаты, а затем создает хэш, чтобы удалять только точные копии, запрашивая подтверждение.
  • Если файлы тем временем изменяются, они не являются точными копиями и проваливаются.

Измените Push-Location чтобы он соответствовал вашей начальной папке, сохраните файл с расширением .ps1 и выполните его.

## Q:\Test\2017\07\15\SU_1230033.ps1
## inspired by http://n3wjack.net/2015/04/06/find-and-delete-duplicate-files-with-just-powershell/

Push-Location "D:\"
Get-ChildItem "* (1).*" -Recurse -File | ForEach-Object {
    $BaseFile = (Join-Path $_.Directory ($_.BaseName -replace ' ?\(\d+\)'))+"*$($_.Extension)"
    Get-ChildItem $BaseFile | Get-FileHash | Group-Object Hash |  Where { $_.Count -gt 1 } | 
        ForEach-Object {$_.Group | Select-Object -Skip 1 } | Remove-Item -Confirm
}
PopD

Чтобы получить просто список файлов dir, используйте этот сокращенный скрипт:

Push-Location "D:\"
Get-ChildItem "* (1).*" -Recurse -File | ForEach-Object {
    $BaseFile = (Join-Path $_.Directory ($_.BaseName -replace ' ?\(\d+\)'))+"*$($_.Extension)"
    Get-ChildItem $BaseFile 
}
PopD

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .