Я хочу пакетно переименовать файлы в папке, добавив префикс имени папки к новым именам. т.е. все файлы C:\house chores\
будут переименованы house chores - $old_name
.
Я хочу пакетно переименовать файлы в папке, добавив префикс имени папки к новым именам. т.е. все файлы C:\house chores\
будут переименованы house chores - $old_name
.
Ответы:
Вариант 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» в конце.
do
) не работает - после того, как некоторые файлы были переименованы, for
находит их под новым именем, снова и снова добавляя префикс, пока не будет достигнут предел длины имени файла.
ren was unexpected at this time.
почему?
do
его ответе отсутствует слово . так и должно бытьfor %a in (.) do ren "%a" "prefix - %a"
Проблема с двумя ответами Powershell здесь заключается в том, что префикс может в конечном итоге дублироваться, поскольку сценарий потенциально будет запускать файл как до, так и после его переименования, в зависимости от каталога, который обрабатывается при выполнении процесса переименования. Чтобы обойти это, просто используйте -Exclude
опцию:
Get-ChildItem -Exclude "house chores-*" | rename-item -NewName { "house chores-" + $_.Name }
Это предотвратит переименование любого файла более одного раза.
Бесплатное программное обеспечение « Утилита массового переименования » также хорошо работает (а также мощно для сложных задач). Скачивание и установка занимает минуту.
Смотрите скриншоты и руководство на исходном сайте.
-
Я не могу предоставить пошаговые снимки экрана, поскольку изображения должны быть выпущены под лицензией Creative Commons License , и я не владею снимками экрана программного обеспечения.
Отказ от ответственности: я никоим образом не связан с указанным программным обеспечением / компанией. Мне понравился продукт для моей собственной задачи, он отвечает требованиям OP и аналогичным требованиям, поэтому рекомендую.
Это сработало для меня, сначала cd в каталоге, в котором вы хотите изменить имена файлов, а затем выполните следующую команду:
Get-ChildItem | rename-item -NewName { "house chores-" + $_.Name }
Я рвал волосы, потому что для некоторых элементов переименованный элемент снова переименовывался (неоднократно, если не достигалась максимальная длина имени файла). Это происходило как для 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.)
Основываясь на ответе @ ofer.sheffer, это вариант CMD для добавления аффикса (это не вопрос, но эта страница по-прежнему является результатом Google №1 при поиске аффикса). Это немного другое из-за расширения.
for %a in (*.*) do ren "%~a" "%~na-affix%~xa"
Вы можете изменить часть "-affix".
Я знаю, что это старый вопрос, но я многому научился из различных ответов, но в качестве функции придумал свое собственное решение. Это должно динамически добавлять родительскую папку в качестве префикса ко всем файлам, которые соответствуют определенному шаблону, но только если у нее еще нет этого префикса.
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
@
in@echo on
не требуется. Вы только что обратились@echo off
.