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


81

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

Відповіді:


146

Варіант 1: Використання Windows PowerShell

Відкрийте меню windows. Введіть: "PowerShell" і відкрийте командне вікно "Windows PowerShell".

Перейти до папки з потрібними файлами: напр. Cd "C: \ house chores" Примітка: адреса має містити лапки "", якщо є пробіли.

Ви можете використовувати "dir", щоб переглянути всі файли в папці. Використовуючи '|' буде конвеєрним виведенням 'dir' для команди, яка наступна.

Примітки: "dir" - це псевдонім "Get-ChildItem". Див .: wiki: cmdlets . Можна надати додаткові функціональні можливості. наприклад, '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'.


1
Незначне чіплятися: @в @echo onне потрібно. Ти щойно повернувся @echo off.
IIНевидимий

9
Варіант 2 (після додавання відсутнього do) не працює - після того, як деякі файли були перейменовані, forзнаходить їх під новою назвою, додаючи префікс знову і знову, доки не буде досягнуто обмеження довжини імені файлу.
Сергій Власов

2
при використанні варіанту 2 я ren was unexpected at this time.уявляю, чому?
нульовий покажчик

4
@billgates У doйого відповіді відсутнє слово . так повинно бутиfor %a in (.) do ren "%a" "prefix - %a"
Крістіан Вестербек

2
@SergeyVlasov Це відбувається в обох варіантах. Єдиним способом уникнути цього було б, щоб перейменування розмістило його над оригіналом. Або, можливо, перемістіть його в іншу папку після перейменування.
Девід Старкі,

41

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

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

Це не дозволить процесу перейменовувати будь-який файл більше одного разу.


1
Будь ласка, додайте до своєї пропозиції менш конкретний приклад, який включає $ _. Directory.Name
ofer.sheffer

18

Безкоштовне програмне забезпечення " Утиліта масового перейменування " також добре працює (і воно також потужне для розширених завдань). Завантаження та встановлення займає хвилину.

Дивіться скріншоти та підручник на оригінальному веб-сайті.

-

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

Застереження: Я жодним чином не пов'язаний із зазначеним програмним забезпеченням / компанією. Мені сподобався продукт для мого власного завдання, він відповідає операційним та подібним вимогам, тому рекомендує.


Я почав користуватися ним у певний момент. +1 за додавання чогось у ланцюжок.
ofer.sheffer

@ ofer.sheffer Дякую.

Ця відповідь не в темі! -1
Марко Демайо

1
@MarcoDemaio Дякуємо за відгук. ОП хоче виконати завдання, а пов'язане програмне забезпечення полегшує його виконання. Я вважаю, що складність рішення не робить його більш актуальним.

@GopalAggarwal: вибачте, ви маєте рацію. Я прочитав у його запитанні "Я хотів би пакетно перейменовувати файли в папці", і я подумав, що він шукає пакетний файл Windows. Я видалив свій -1.
Марко Демайо

9

Це спрацювало для мене, спочатку компакт-диск у каталозі, на який ви хотіли б змінити імена файлів, а потім виконайте таку команду:

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

5
Це спричиняє нескінченний цикл, доки ім’я файлу не досягне обмеження для Windows. Замість того, щоб використовувати @ Dave.Gugg у відповідь: stackoverflow.com/a/37279979/2179408
Роб Белл

7

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

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

Це "блокує" результати, повернені Get-ChildItem, у змінну $ dirs, і ви можете перебирати її, не боячись того, що порядок зміниться або відбудеться інший кумедний бізнес.

Порада Дейва.Гугга щодо використання -Exclude також повинна вирішити цю проблему, але це інший підхід; можливо, якщо файли, які перейменовані, вже містять шаблон, використаний у префіксі.

(Застереження: я дуже PowerShell n00b.)


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".


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

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