Видалення повторюваних частин імені файлу? [зачинено]


-1

Ми регулярно завантажуємо файли, які повторюють частини імені файлу. Це проблема, оскільки диск, який ми повинні зберегти, має обмеження на 256 символів, і вони зберігаються в багатьох підтеках. На даний момент я вручну видаляю повторювані частини імені файлу, які є однаковими, відповідно до доданого зображення, видалені частини виділені червоним кольором: enter image description here

Чи є пакетний файл / більш швидкий спосіб пошуку дублікатів у імені файлу і його видалення? Дякую, Русс.


2
Отже, якщо ви знаєте про обмеження 256 символів File Explorer, то вам слід змінити розташування завантаження, тому обмеження не є проблемою.
Ramhound

2
Я б сказав, що сценарій (або програма) для цього буде досить складним. Уявіть собі this_is_a_long_name_which_is_an_example.ext - якщо ви "дедублікуєте" ім'я, то швидше за все це станеться this_is_a_long_name_whichn_example.ext, as _is_a згадується двічі. так що якщо у вас немає точна схема що всі нові імена файлів мають спільний доступ (напр., file_name_-_file-name - file name.ext ), це практично неможливо зробити автоматизованим способом.
flolilolilo

2
Це насправді не так складно. Я б використав powershell. Схоже, що кожен дублікат розділений a _ характер. Таким чином, powerhell може легко розділити ім'я файлу на _ а потім видалити всі дублікати в отриманому масиві. Нарешті, він може використовувати очищений масив для створення нового імені файлу без дублікатів.
Appleoddity

(2/2), якщо у вас є така схема, використовуючи PowerShell, ви можете спробувати .Split() BaseName, .Replace() слово-роздільник (пробіл, крапка, підкреслення, дефіс, ...), щоб вони були однаковими Sort-Object -Unique потім порівняти їх .Join() назад, і використовуйте їх як нові BaseName в Rename-Item.
flolilolilo

Привіт, Рамхаунд, я не можу це зробити, робота нашої компанії виходить з мого контролю. Flolilolilo, спасибі, я не думав, що це буде легко, і, нарешті, Appleoddity, я досить основний користувач, і не маю уявлення, як це зробити, у вас є час сказати мені? Дякую всім :)
Russell_s_smith

Відповіді:


1

Відмова від відповідальності: Цей PowerShell-код не був достатньо перевірений, щоб знати, що він буде працювати належним чином у всіх середовищах з усіма можливими незвичними файлами / форматами. Але, він працює на ваших прикладах. Використовуйте на свій страх і ризик Rename-Item з -WhatIf -перемикання (таким чином, він буде показувати тільки те, що він буде робити, не фактично аніруючи ім'я файлу).


Зразок папки:

CDS 202 - GLAZING PACKERS_CDS 202 - Glazing Packers_CDS 202 - Glazing Packers.docx
CDS 202 - GLAZING PACKERS_CDS 202 - Glazing Packers_CDS 202 - Glazing Packers.pdf
CDS 202 - GLAZING PACKERS_PX-INA-PD-RP-X-XX-XX-0026.pdf

Ось приклади, як виконати завдання:

# Remove all duplicates in filenames in current folder: (Case Sensitive)
Get-ChildItem -Path .\* -File | ForEach-Object {
    Rename-Item $_ -NewName ((($_.Basename.Split("_") | Select-Object -Unique) -Join "_") + $($_.Extension))
}

# Results:
# CDS 202 - GLAZING PACKERS_CDS 202 - Glazing Packers.docx
# CDS 202 - GLAZING PACKERS_CDS 202 - Glazing Packers.pdf
# CDS 202 - GLAZING PACKERS_PX-INA-PD-RP-X-XX-XX-0026.pdf
# Remove all duplicates in filenames in current folder: (Case Insensitive - Drawback: filenames are converted to upper case)
Get-ChildItem -Path .\* -File | ForEach-Object {
    Rename-Item $_ -NewName ((($_.Basename.Split("_").ToUpper() | Select-Object -Unique) -Join "_") + $($_.Extension))
}

# Results:
# CDS 202 - GLAZING PACKERS.docx
# CDS 202 - GLAZING PACKERS.pdf
# CDS 202 - GLAZING PACKERS_PX-INA-PD-RP-X-XX-XX-0026.pdf
# Remove all duplicates in filenames in current folder and all subfolders: (Case Sensitive)
Get-ChildItem -Path .\* -File -Recurse | ForEach-Object {
    Rename-Item $_ -NewName ((($_.Basename.Split("_") | Select-Object -Unique) -Join "_") + $($_.Extension))
}

# Results:
# CDS 202 - GLAZING PACKERS_CDS 202 - Glazing Packers.docx
# CDS 202 - GLAZING PACKERS_CDS 202 - Glazing Packers.pdf
# CDS 202 - GLAZING PACKERS_PX-INA-PD-RP-X-XX-XX-0026.pdf
# Remove all duplicates in filenames in current folder and all subfolders: (Case Insensitive - Drawback: all filenames are converted to upper case)
Get-ChildItem -Path .\* -File -Recurse | ForEach-Object {
    Rename-Item $_ -NewName ((($_.Basename.Split("_").ToUpper() | Select-Object -Unique) -Join "_") + $($_.Extension))
}

# Results:
# CDS 202 - GLAZING PACKERS.docx
# CDS 202 - GLAZING PACKERS.pdf
# CDS 202 - GLAZING PACKERS_PX-INA-PD-RP-X-XX-XX-0026.pdf

Насолоджуйтесь!


Велике спасибі Appleoddity, прекрасно працює за те, що я намагаюся досягти! Найбільше цінується.
Russell_s_smith

Не те, що я маю проблеми з нею безпосередньо, але чому ви змінили результати? Я взяв їх з особистих тестів (PowerShell 5.1), тому вони повинні були бути точними - або я зробив помилку?
flolilolilo

@flolilolilo Я ціную ваші оновлення. Але я повернувся, щоб зробити невелику зміну моєї відповіді, тому що я скопіював і вставив неправильно. Ця зміна вплинула на результат кожного з ваших результатів. Вона зробила вигляд, що команда не працювала правильно, але насправді це робиться, і я виправив все, що відповідає посту.
Appleoddity

@Appleoddity Ах - чомусь я не помітив зміни в коді, але тільки зміни в результатах - вибачте за турботу!
flolilolilo
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.