Форум программистов, компьютерный форум, киберфорум
Наши страницы
PowerShell
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.67/15: Рейтинг темы: голосов - 15, средняя оценка - 4.67
Galch86
0 / 0 / 0
Регистрация: 12.02.2016
Сообщений: 22
1

Пакетное переименование файлов

23.02.2016, 22:14. Просмотров 3143. Ответов 13
Метки нет (Все метки)

Возникла необходимость папку с большим кол-вом файлом переименовать 1,2,3,4,5.....
Например фильмы или музыку или фото что бы шло по порядку (вместо длинных имен )
В сети находил много скриптов, где есть переименование с добавлением определенного имени или замене части имени. А в данном случае, нужно что бы просто шло по возрастанию с 1 и до бесконечности

Два варианта:
1. Если файлы имеют порядок по имени:

s01e01.1.of.3.dvdrip.rus.eng.avi
s01e02.1.of.2.dvdrip.rus.eng.avi
s01e02.2.of.2.dvdrip.rus.eng.avi
s01e03.1.of.3.dvdrip.rus.eng.avi
s01e03.2.of.3.dvdrip.rus.eng.avi
s01e03.3.of.3.dvdrip.rus.eng.avi
s01e04.1.of.2.dvdrip.rus.eng.avi
s01e04.2.of.2.dvdrip.rus.eng.avi
s02e01.dvdrip.rus.eng.avi
s02e02.1.of.2.dvdrip.rus.eng.avi
s02e02.2.of.2.dvdrip.rus.eng.avi
s02e03.1.of.2.dvdrip.rus.eng.avi
s02e03.2.of.2.dvdrip.rus.eng.avi
s02e04.1.of.2.dvdrip.rus.eng.avi
s02e04.2.of.2.dvdrip.rus.eng.avi
s03e01.dvdrip.rus.eng.avi
s03e02.dvdrip.rus.eng.avi
s03e03.dvdrip.rus.eng.avi
s03e04.dvdrip.rus.eng.avi



2. Второй вариант, когда файлы имеют произвольные имена, по которым не отсортировать. И тогда хотелось произвести сортировку по дате изменения и так же переименовать 1,2,3 в порядке возрастания
0
Лучшие ответы (1)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
23.02.2016, 22:14
Ответы с готовыми решениями:

Рекурсивное переименование файлов, md5-хеш которых совпадает с md5-хешем, указанном в списке файлов
Есть файл из двух колонок md5-хеш и имя файла (краткое, с расширением, UTF-8)....

Групповое переименование файлов средствами PowerShell 2.0
Здравствуйте, при переименовании файлов скрипт отрабатывает не со всеми...

Переименование файлов в соответствии с текстовым файлом
В папке имеется N файлов и txt с N строчками. Задача: составить скрипт, который...

Массовое переименование файлов по заданному условию
Добрый день. Поймал вирус шифровальщик и он переименовал мои файлы. ...

Переименование файлов в имена, взятые из XLSX-файла
Привет! Столкнулся с проблемой. Есть файл name.xlsx внутри которого одна...

13
KDE777
837 / 618 / 264
Регистрация: 22.01.2016
Сообщений: 1,693
24.02.2016, 01:08 2
Лучший ответ Сообщение было отмечено Galch86 как решение

Решение

Цитата Сообщение от Galch86 Посмотреть сообщение
Если файлы имеют порядок по имени
Отсортируем все файлы в папке c:\temp по имени и переименуем их в 001.*, 002.*, ...

PowerShell
1
$i=1;ls c:\Temp -File | sort Name | %{$_ | ren -NewName ($i.ToString().PadLeft('3','0') + $_.Extension);$i++}
Цитата Сообщение от Galch86 Посмотреть сообщение
произвести сортировку по дате изменения и так же переименовать 1,2,3 в порядке возрастания
Отсортируем все файлы в папке c:\temp по дате/времени изменения и переименуем их в 001.*, 002.*, ...

PowerShell
1
$i=1;ls c:\Temp -File | sort LastWriteTime | %{$_ | ren -NewName ($i.ToString().PadLeft('3','0') + $_.Extension);$i++}
Ну и например, отсортируем по имени файлы во всех подкаталогах и ниже (рекурсивно) в папке c:\temp и переименуем их в 001.*, 002.*, ... Нумерация в каждом подкаталоге будет начинаться заново:

PowerShell
1
ls c:\Temp -R | ?{$_.PSIsContainer} | %{$i=1;$_ | ls -File | sort Name | %{$_ | ren -NewName ($i.ToString().PadLeft('3','0') + $_.Extension);$i++}}
Добавлено через 6 минут
Galch86, Или вам нужно сохранить оригинальное имя файла + добавить к началу порядковый номер?
1
Galch86
0 / 0 / 0
Регистрация: 12.02.2016
Сообщений: 22
24.02.2016, 02:34  [ТС] 3
Спасибо KDE777. Вы ответили на мой вопрос.
Да мне именно так и нужно было без сохранения части имени. Все же не 1,2,3 , а 001, 002, 003 выглядит лучше для упорядочивания в проводнике, вы правы.
Теперь осталось разобраться (хочется научиться понимать) в скрипте.

Добавлено через 37 минут
По первому скрипту порядок действий какой ?

- Задается переменная для цыкла , начало отсчета . 1
- Выводятся (возращение) файлы в папке темп, только файлы (то есть вместо -file , можно было -directory, для вывода только папок , если бы стояла такая задача )
- далее файлы передаются по конвееру на сортировку по имени (тут вместо имени можно и по дате , как в следующем варианте )
- затем цыкл перебегает с помощью переменной $._ все элементы по очереди
- ren это псевдоним для переименования файлов
- NewName это новое имя файла , которое возмет имя значение $i, переведенное в строку $i.ToString()
- далее новое имея состоит из 3х нулей +

Если я верно понял, то объясните пожалуйста , что делает + $_.Extension ?
По логики добавляет значение на единицу больше
Но если 001 это строка , а что бы получилось 001+ 1 = 002 , нужно что бы тип был численный , а не строковый

Или я совсем не правильно понимаю...
Что такое Extension не нашел
0
KDE777
837 / 618 / 264
Регистрация: 22.01.2016
Сообщений: 1,693
24.02.2016, 09:27 4
Galch86,

Extension - это расширение текущего файла
0
Galch86
0 / 0 / 0
Регистрация: 12.02.2016
Сообщений: 22
24.02.2016, 09:39  [ТС] 5
Блин, оказалось все проще!
Спасибо теперь у меня в голове все сходиться !
0
KDE777
837 / 618 / 264
Регистрация: 22.01.2016
Сообщений: 1,693
24.02.2016, 10:01 6
Цитата Сообщение от Galch86 Посмотреть сообщение
Теперь осталось разобраться (хочется научиться понимать) в скрипте.
Тогда лучше вот так (без псевдонимов):

PowerShell
1
2
3
4
5
6
7
8
9
$folder = 'c:\Temp'
$i = 1
 
foreach ($item in Get-ChildItem -Path $folder -File | Sort-Object -Property Name)
{
    $NewName = $i.ToString().PadLeft('3','0') + $item.Extension
    Rename-Item -Path $item.FullName -NewName $NewName
    $i = $i + 1
}
Цитата Сообщение от Galch86 Посмотреть сообщение
далее новое имея состоит из 3х нулей
Не совсем так - метод .PadLeft('3','0') дополняет строку слева нужными символами до нужной длины, т.е. в нашем случае - делает меньшую строку длинной 3 символа за счёт добавления нулей слева:

PowerShell
1
2
3
"9".PadLeft('3','0')
"99".PadLeft('3','0')
"999".PadLeft('3','0')
009
099
999

Цитата Сообщение от Galch86 Посмотреть сообщение
затем цыкл перебегает с помощью переменной $._ все элементы по очереди
Цикл или перебор всех элементов в папке (в этом примере) мы делаем с помощью ForEach-Object (сокращённо - %), например:

PowerShell
1
$i=0;ls c:\Temp -File | sort LastWriteTime | %{$i++;write-host $i $_.Name}
1
Galch86
0 / 0 / 0
Регистрация: 12.02.2016
Сообщений: 22
24.02.2016, 12:52  [ТС] 7
Второй способ, более правильный для усвоения, спасибо. Теперь сам смогу подобные задачи делать с пониманием.
Разобрался во всем, кроме "$item.FullName".
0
KDE777
837 / 618 / 264
Регистрация: 22.01.2016
Сообщений: 1,693
24.02.2016, 13:14 8
Цитата Сообщение от Galch86 Посмотреть сообщение
Разобрался во всем, кроме "$item.FullName"
В переменную $item поочерёдно попадает, с помощью конструкции [foreach in], свойства каждого файла, т.е. таким образом мы можем использовать любое доступное свойство файла:

PowerShell
1
$item | Get-Member -MemberType Property
Кликните здесь для просмотра всего текста
Код
Name              MemberType Definition                                    
----              ---------- ----------                                    
Attributes        Property   System.IO.FileAttributes Attributes {get;set;}
CreationTime      Property   datetime CreationTime {get;set;}              
CreationTimeUtc   Property   datetime CreationTimeUtc {get;set;}           
Directory         Property   System.IO.DirectoryInfo Directory {get;}      
DirectoryName     Property   string DirectoryName {get;}                   
Exists            Property   bool Exists {get;}                            
Extension         Property   string Extension {get;}                       
FullName          Property   string FullName {get;}                        
IsReadOnly        Property   bool IsReadOnly {get;set;}                    
LastAccessTime    Property   datetime LastAccessTime {get;set;}            
LastAccessTimeUtc Property   datetime LastAccessTimeUtc {get;set;}         
LastWriteTime     Property   datetime LastWriteTime {get;set;}             
LastWriteTimeUtc  Property   datetime LastWriteTimeUtc {get;set;}          
Length            Property   long Length {get;}                            
Name              Property   string Name {get;}


Итого, в этом скрипте: $item.FullName - это полный путь к очередному файлу, а $item.Extension - это его расширение...
1
Galch86
0 / 0 / 0
Регистрация: 12.02.2016
Сообщений: 22
25.02.2016, 17:10  [ТС] 9
А если нужно будет у всех файлов поменять расширение (отдельно от переименования или вместе)
Здесь такой же принцип работает ?
001.avi
002.avi
003.avi
004.avi
......
Сделать в

001.mp4
002.mp4
003.mp4
004.mp4
......
0
KDE777
837 / 618 / 264
Регистрация: 22.01.2016
Сообщений: 1,693
25.02.2016, 17:18 10
Цитата Сообщение от Galch86 Посмотреть сообщение
А если нужно будет у всех файлов поменять расширение (отдельно от переименования или вместе)
Да примерно, также.

Цитата Сообщение от Galch86 Посмотреть сообщение
отдельно от переименования
PowerShell
1
2
 $NewName = $item.BaseName + '.mp4'
 Rename-Item -Path $item.FullName -NewName $NewName
Цитата Сообщение от Galch86 Посмотреть сообщение
или вместе

PowerShell
1
2
$NewName = $i.ToString().PadLeft('3','0') + '.mp4'
Rename-Item -Path $item.FullName -NewName $NewName
1
Galch86
0 / 0 / 0
Регистрация: 12.02.2016
Сообщений: 22
03.03.2016, 14:48  [ТС] 11
KDE777 спасибо огромное.
Остался только один нюанс. Если папка имеет в имени скобки, то переименование файлов не проходит (вообще ничего не происходить, даже ошибка не показывается выполнения скрипта )
Приходится в ручную убирать скобки, и тогда скрипт работает уже нормально
0
KDE777
837 / 618 / 264
Регистрация: 22.01.2016
Сообщений: 1,693
03.03.2016, 15:55 12
Цитата Сообщение от Galch86 Посмотреть сообщение
Если папка имеет в имени скобки, то переименование файлов не проходит
у себя такой проблемы не вижу:

PowerShell
1
2
3
4
5
6
7
8
9
10
11
Write-Host 'До переименования:'
 
ls 'C:\Temp\_(TEST)\'
 
$item = Get-Item -Path 'C:\Temp\_(TEST)\01.LOG'
$NewName = $item.BaseName + '.mp4'
Rename-Item -Path $item.FullName -NewName $NewName
 
Write-Host 'После переименования:'
 
ls 'C:\Temp\_(TEST)\'
Кликните здесь для просмотра всего текста

Код
До переименования:


    Каталог: C:\Temp\_(TEST)


Mode                LastWriteTime     Length Name                                                                                                                
----                -------------     ------ ----                                                                                                                
-a---        08.02.2016     16:59   10485886 01.log                                                                                                              
-a---        10.02.2016      9:54  212790242 big.log                                                                                                             
-a---        10.02.2016      9:50   13584249 test.zip                                                                                                            
После переименования:
-a---        08.02.2016     16:59   10485886 01.mp4                                                                                                              
-a---        10.02.2016      9:54  212790242 big.log                                                                                                             
-a---        10.02.2016      9:50   13584249 test.zip


Или вы про какие-то другие скобки? Можете показать проблемный путь?
0
Galch86
0 / 0 / 0
Регистрация: 12.02.2016
Сообщений: 22
03.03.2016, 16:33  [ТС] 13
Сейчас не у компьютера.
Когда буду на месте , скачаю заново сериал и напишу.
Папка имела имя примерно такое hor[s04.23]trecer.....
0
KDE777
837 / 618 / 264
Регистрация: 22.01.2016
Сообщений: 1,693
03.03.2016, 17:21 14
Цитата Сообщение от Galch86 Посмотреть сообщение
Папка имела имя примерно такое hor[s04.23]trecer.....
Если в пути есть квадратные скобки, тогда замените у Get-ChildItem ключ -Path на -LiteralPath

PowerShell
1
Get-ChildItem -LiteralPath "C:\Movies\hor[s04.23]trecer"
1
03.03.2016, 17:21
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
03.03.2016, 17:21

Переименование и сортировка файлов в имена, взятые из txt-файла - PowerShell
Всем привет! Хочу сделать скрипт для автоматической сортировке видео (.mp4) и...

Пакетное переименование файлов
Есть файлы ___ нужно скрипт групового переименования файлов где меняеться...

Нестандартное пакетное переименование
Добрый вечер. Есть каталог с несколькими десятками папок. В каждой из этой...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
14
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru