Переименовать несколько файлов в папке, добавить префикс (Windows)

81

Я хочу пакетно переименовать файлы в папке, добавив префикс имени папки к новым именам. т.е. все файлы C:\house chores\будут переименованы house chores - $old_name.

ofer.sheffer
источник

Ответы:

146

Вариант 1. Использование Windows PowerShell

Откройте меню Windows. Введите: «PowerShell» и откройте командное окно Windows PowerShell.

Перейти к папке с желаемыми файлами: например, cd "C: \ house chores" Примечание: адрес должен включать кавычки "", если есть пробелы.

Вы можете использовать «dir», чтобы увидеть все файлы в папке. Используя '|' будет конвейерно выводить 'dir' для следующей команды.

Примечания: «dir» - это псевдоним Get-ChildItem. См. Вики: командлеты . Можно предоставить дополнительную функциональность. например, 'dir -recurse' выводит все файлы, папки и подпапки.

Что, если мне нужен только диапазон файлов?

Вместо dir | Я могу использовать:

dir | where-object -filterscript {($_.Name -ge 'DSC_20') -and ($_.Name -le 'DSC_31')} |

Для пакетного переименования с именем каталога в качестве префикса:

dir | Rename-Item -NewName {$_.Directory.Name + " - " + $_.Name}

Вариант 2: использование командной строки

В папке нажмите Shift + щелкните правой кнопкой мыши: выберите «открыть командное окно здесь»

for %a in (*.*) do ren "%a" "prefix - %a"

Если файлов много, было бы неплохо добавить перед этим команду «@echo off» и команду «echo on» в конце.

ofer.sheffer
источник
1
Мелкие придирки: @in @echo onне требуется. Вы только что обратились @echo off.
IInspectable 02
9
Вариант 2 (после добавления отсутствующего do) не работает - после того, как некоторые файлы были переименованы, forнаходит их под новым именем, снова и снова добавляя префикс, пока не будет достигнут предел длины имени файла.
Сергей Власов
2
при использовании варианта 2 я понимаю, ren was unexpected at this time.почему?
нулевой указатель
4
@billgates В doего ответе отсутствует слово . так и должно бытьfor %a in (.) do ren "%a" "prefix - %a"
Christiaan Westerbeek
2
@SergeyVlasov Это происходит в обоих вариантах. Единственный способ избежать этого - поместить переименование поверх оригинала. Или, возможно, переместите его в другую папку после переименования.
Дэвид Старки
41

Проблема с двумя ответами Powershell здесь заключается в том, что префикс может в конечном итоге дублироваться, поскольку сценарий потенциально будет запускать файл как до, так и после его переименования, в зависимости от каталога, который обрабатывается при выполнении процесса переименования. Чтобы обойти это, просто используйте -Excludeопцию:

Get-ChildItem -Exclude "house chores-*" | rename-item -NewName { "house chores-" + $_.Name }

Это предотвратит переименование любого файла более одного раза.

Дэйв Гугг
источник
1
Пожалуйста, подумайте о добавлении к вашему предложению менее конкретного примера, который включает в себя $ _. Directory.Name
ofer.sheffer 01
18

Бесплатное программное обеспечение « Утилита массового переименования » также хорошо работает (а также мощно для сложных задач). Скачивание и установка занимает минуту.

Смотрите скриншоты и руководство на исходном сайте.

-

Я не могу предоставить пошаговые снимки экрана, поскольку изображения должны быть выпущены под лицензией Creative Commons License , и я не владею снимками экрана программного обеспечения.

Отказ от ответственности: я никоим образом не связан с указанным программным обеспечением / компанией. Мне понравился продукт для моей собственной задачи, он отвечает требованиям OP и аналогичным требованиям, поэтому рекомендую.


источник
В какой-то момент начал им пользоваться. +1 за добавление чего-то в ветку.
ofer.sheffer
@ ofer.sheffer Спасибо.
Этот ответ не по теме! -1
Marco Demaio
1
@MarcoDemaio Спасибо за отзыв. OP хочет выполнить задачу, а связанное программное обеспечение упрощает ее выполнение. Думаю, сложность решения не делает его актуальнее.
@GopalAggarwal: извините, вы правы, я прочитал в его вопросе «Я хотел бы пакетно переименовать файлы в папке», и я подумал, что он искал командный файл Windows. Я удалил свой -1.
Марко Демайо
9

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

Get-ChildItem | rename-item -NewName { "house chores-" + $_.Name }
user3971138
источник
5
Это вызывает бесконечный цикл, пока имя файла не достигнет предела Windows. Вместо этого используйте ответ @Dave.Gugg: stackoverflow.com/a/37279979/2179408
Роб Белл
7

Я рвал волосы, потому что для некоторых элементов переименованный элемент снова переименовывался (неоднократно, если не достигалась максимальная длина имени файла). Это происходило как для Get-ChildItem, так и для передачи вывода dir. Я предполагаю, что переименованные файлы были подобраны из-за изменения в алфавитном порядке. Я решил эту проблему следующим образом:

Get-ChildItem -Path . -OutVariable dirs
foreach ($i in $dirs) { Rename-Item $i.name ("<MY_PREFIX>"+$i.name) }

Это «блокирует» результаты, возвращаемые Get-ChildItem, в переменной $ dirs, и вы можете перебирать их, не опасаясь, что порядок будет изменен или произойдут другие забавные дела.

Совет Dave.Gugg по использованию -Exclude также должен решить эту проблему, но это другой подход; возможно, если переименовываемые файлы уже содержат шаблон, использованный в префиксе.

(Отказ от ответственности: я очень люблю PowerShell n00b.)

фантом-99w
источник
2

На основе ответа @ ofer.sheffer эта команда массово переименует и добавит текущую дату к имени файла. т.е. "file.txt" становится "20180329 - file.txt" для всех файлов в текущей папке

for %a in (*.*) do ren "%a" "%date:~-4,4%%date:~-7,2%%date:~-10,2% - %a"
Карпа
источник
2

Основываясь на ответе @ ofer.sheffer, это вариант CMD для добавления аффикса (это не вопрос, но эта страница по-прежнему является результатом Google №1 при поиске аффикса). Это немного другое из-за расширения.

for %a in (*.*) do ren "%~a" "%~na-affix%~xa"

Вы можете изменить часть "-affix".

Roverv
источник
0

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

function Add-DirectoryPrefix($pattern) {
    # To debug, replace the Rename-Item with Select-Object
    Get-ChildItem -Path .\* -Filter $pattern -Recurse | 
        Where-Object {$_.Name -notlike ($_.Directory.Name + '*')} | 
        Rename-Item -NewName {$_.Directory.Name + '-' + $_.Name}
        # Select-Object -Property Directory,Name,@{Name = 'NewName'; Expression= {$_.Directory.Name + '-' + $_.Name}}
}

https://gist.github.com/kmpm/4f94e46e569ae0a4e688581231fa9e00

км / мин
источник