Как удалить все символы из нескольких имен файлов после указанных символов - Powershell - PullRequest
0 голосов
/ 23 апреля 2020

Простите, если я плохо объясню, я очень плохо знаком с PowerShell.

Я пытаюсь очистить свои медиа-файлы и пытаюсь удалить все символы после указанной строки из нескольких файлов с помощью все подкаталоги каталога.

Длина имени файла не будет согласованной. Но типы файлов будут. Мне также нужно исключить расширение для удаления.

Таким образом, файлы будут выглядеть примерно так:

  1. TVshow S01 E01 Название эпизода.mp4
  2. LongerTVShow S03 E01 Название episode.mp4

Я хочу удалить все после E01, сохраняя при этом E01

Результат:

  1. TVshow S01 E01.mp4
  2. LongerTVShow S03 E01.mp4

В настоящее время у меня есть несколько других строк, которые очищают указанные мной символы, например, нахождение периодов и замена их пробелами:

get-childitem -recurse | dir -Filter *.mp4 | Rename-Item -NewName { $_.BaseName.replace('.',' ') + $_.Extension }

Это хорошо работает, так как будет применяться ко всем файлам в каталоге. Но вам нужно указать символ для замены.

Тогда я просто собирался использовать несколько экземпляров команды для E01, E02, E03 и c. Таким же образом я удаляю несколько строк, как в приведенном ниже коде:

get-childitem -recurse | dir -Filter *.txt | Rename-Item -NewName { $_.BaseName.replace('1080p','').replace('720p','').replace('HD','') + $_.Extension }

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

Спасибо за любые ответы!


Редактировать

Я использовал код AdminOfThings и добавил его в что у меня есть.

get-childitem -recurse |dir -Filter *.mp4 | Rename-Item -NewName { ($_.BaseName -creplace '(?<=S\d+ E\d+)\D.*') + $_.Extension }

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

  1. TvShow S01 E04 title_of_show.mp4
  2. TvShow S08 E03Title_of_show.mp4

в:

  1. TvShow S01 E04.mp4
  2. TvShow S08 E03.mp4

Очень конкретно c, но кто-то может найти это полезным.

Ответы [ 2 ]

0 голосов
/ 24 апреля 2020

Вы можете сделать следующее:

Get-ChildItem -Recurse -Filter *.txt -File |
    Rename-Item -NewName { ($_.BaseName -creplace '(?<=S\d+ E\d+)\D.*') + $_.Extension }

Объяснение:

Оператор -creplace выполняет регистрозависимое совпадение с учетом регистра (-replace регистр -чувствителен), а затем замена строки. Если замена строки не используется, сопоставляемая строка просто заменяется пустой строкой.

Строка регулярного выражения (?<=S\d+ E\d+)\D.*.

  • (?<=) является положительным механизмом обратного просмотра. Это означает, что текущая позиция в строке должна содержать предыдущие символы, которые соответствуют выражению lookbehind.
  • S\d+ соответствует буквальным s или S и одной или нескольким (+) цифрам (* 1023) *). В нашем случае сопоставляется только S, потому что мы используем -creplace. Пробел после \d+ является буквальным пробелом.
  • E\d+ соответствует литералу E и одной или нескольким цифрам.
  • \D соответствует не-диному git символу. Это необходимо для того, чтобы взгляд \d+ не возвращал никаких цифр. Это позволяет нам быть в настоящее время не-di git и знать, что мы сопоставили все предыдущие цифры.
  • .* жадно сопоставляет любые символы до конца строки.
0 голосов
/ 24 апреля 2020

Это долго, но как насчет этого:

dir -Filter *.mp4 | Rename-Item -NewName { $_.BaseName.Split(' ')[0] + ' ' + $_.BaseName.Split(' ')[1] + ' ' + $_.BaseName.Split(' ')[2] + $_.Extension }
...