Zmień nazwę wielu plików w folderze, dodaj prefiks (Windows)

81

Chciałbym zbiorczo zmieniać nazwy plików w folderze, dodając przedrostek nazwy folderu do nowych nazw. tzn. wszystkie pliki C:\house chores\zostaną zmienione house chores - $old_name.

ofer.sheffer
źródło

Odpowiedzi:

146

Opcja 1: Korzystanie z programu Windows PowerShell

Otwórz menu systemu Windows. Wpisz: „PowerShell” i otwórz okno poleceń „Windows PowerShell”.

Idź do folderu z żądanymi plikami: np. Cd "C: \ prace domowe" Uwaga: adres musi zawierać cudzysłowy "", jeśli są spacje.

Możesz użyć „dir”, aby zobaczyć wszystkie pliki w folderze. Używanie „|” potokuje wyjście 'dir' dla następującego polecenia.

Uwagi: „dir” jest aliasem „Get-ChildItem”. Zobacz: wiki: cmdlets . Można zapewnić dodatkową funkcjonalność. np. „dir -recurse” wyświetla wszystkie pliki, foldery i podfoldery.

A jeśli chcę tylko zakresu plików?

Zamiast „dir |” Mogę użyć:

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

W przypadku partii zmiany nazwy z nazwą katalogu jako przedrostkiem:

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

Opcja 2: Korzystanie z wiersza polecenia

W folderze naciśnij shift + prawy przycisk myszy: wybierz „otwórz tutaj okno poleceń”

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

Jeśli jest dużo plików, dobrze byłoby dodać przed tym polecenie „@echo off” i na końcu polecenie „echo on”.

ofer.sheffer
źródło
1
Minor nitpick: the @w @echo onnie jest wymagane. Właśnie się odwróciłeś @echo off.
Niespodziewany
9
Opcja 2 (po dodaniu brakującego do) nie działa - po zmianie nazwy niektórych plików forznajduje je pod nową nazwą, dodając raz po raz prefiks, aż do osiągnięcia limitu długości nazwy pliku.
Sergey Vlasov
2
korzystając z opcji 2, mam ren was unexpected at this time.pojęcie, dlaczego?
zerowy wskaźnik
4
@billgates W dojego odpowiedzi brakuje słowa . powinno byćfor %a in (.) do ren "%a" "prefix - %a"
Christiaan Westerbeek
2
@SergeyVlasov Dzieje się tak w obu Opcjach. Jedynym sposobem uniknięcia tego byłoby umieszczenie zmiany nazwy nad oryginałem. Lub przenieś go do innego folderu po zmianie nazwy.
David Starkey
41

Problem z dwiema odpowiedziami Powershell polega na tym, że prefiks może zostać zduplikowany, ponieważ skrypt potencjalnie uruchomi plik zarówno przed, jak i po zmianie nazwy, w zależności od katalogu, który jest używany podczas procesu zmiany nazwy. Aby to obejść, po prostu użyj -Excludeopcji:

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

Zapobiegnie to wielokrotnej zmianie nazwy jednego pliku przez proces.

Dave.Gugg
źródło
1
Rozważ dodanie do swojej sugestii mniej szczegółowego przykładu, który zawiera $ _. Directory.Name
ofer.sheffer
18

Wolne oprogramowanie „ Narzędzie zbiorczej zmiany nazwy ” również działa dobrze (i jest potężne również w przypadku zaawansowanych zadań). Pobieranie i instalacja zajmuje minutę.

Zobacz zrzuty ekranu i samouczek na oryginalnej stronie internetowej.

-

Nie mogę dostarczyć zrzutów ekranu krok po kroku, ponieważ obrazy będą musiały zostać udostępnione na licencji Creative Commons , a nie jestem właścicielem zrzutów ekranu oprogramowania.

Zrzeczenie się: nie jestem w żaden sposób powiązany z tym oprogramowaniem / firmą. Produkt spodobał mi się do własnego zadania, spełnia wymagania OP i tym podobne, więc polecam.


źródło
W pewnym momencie sam zacząłem go używać. +1 za dodanie czegoś do wątku.
ofer.sheffer
@ ofer.sheffer Dziękuję.
Ta odpowiedź jest poza tematem! -1
Marco Demaio
1
@MarcoDemaio Dzięki za informację zwrotną. OP chce wykonać zadanie, a połączone oprogramowanie ułatwia to wykonanie. Uważam, że złożoność rozwiązania nie czyni go bardziej odpowiednim.
@GopalAggarwal: przepraszam, masz rację. Przeczytałem w jego pytaniu „Chciałbym zbiorczo zmienić nazwy plików w folderze” i pomyślałem, że szuka pliku wsadowego systemu Windows. Usunąłem -1.
Marco Demaio
9

To zadziałało dla mnie, najpierw cd w katalogu, w którym chcesz zmienić nazwy plików, a następnie uruchom następujące polecenie:

Get-ChildItem | rename-item -NewName { "house chores-" + $_.Name }
user3971138
źródło
5
Powoduje to nieskończoną pętlę, dopóki nazwa pliku nie osiągnie limitu systemu Windows. Zamiast tego użyj odpowiedzi @ Dave.Gugg: stackoverflow.com/a/37279979/2179408
Rob Bell
7

Wyrywałem sobie włosy, ponieważ w przypadku niektórych pozycji nazwa elementu o zmienionej nazwie byłaby ponownie zmieniana (wielokrotnie, chyba że została osiągnięta maksymalna długość nazwy pliku). Działo się to zarówno w przypadku Get-ChildItem, jak i przesyłania danych wyjściowych dir. Wydaje mi się, że pliki o zmienionych nazwach zostały przejęte z powodu zmiany kolejności alfabetycznej. Rozwiązałem ten problem w następujący sposób:

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

To „blokuje” wyniki zwrócone przez Get-ChildItem w zmiennej $ dirs i można je iterować bez obawy, że zmieni się kolejność lub wydarzy się inny zabawny biznes.

Wskazówka Dave.Gugga dotycząca używania -Exclude również powinna rozwiązać ten problem, ale to jest inne podejście; być może jeśli zmieniane nazwy plików zawierają już wzorzec użyty w przedrostku.

(Zastrzeżenie: jestem bardzo PowerShell n00b.)

phantom-99w
źródło
2

Na podstawie odpowiedzi @ ofer.sheffer polecenie to masowo zmieni nazwę i doda aktualną datę do nazwy pliku. tzn. „plik.txt” staje się „20180329 - plik.txt” dla wszystkich plików w bieżącym folderze

for %a in (*.*) do ren "%a" "%date:~-4,4%%date:~-7,2%%date:~-10,2% - %a"
karpa
źródło
2

Opierając się na odpowiedzi @ ofer.sheffer, jest to wariant CMD do dodawania afiksu (to nie jest pytanie, ale ta strona jest nadal numerem 1 w wynikach Google, jeśli szukasz przyrostka). Ze względu na rozszerzenie jest trochę inaczej.

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

Możesz zmienić część „-affix”.

roverv
źródło
0

Wiem, że to stare pytanie, ale wiele się nauczyłem z różnych odpowiedzi, ale wymyśliłem własne rozwiązanie jako funkcję. Powinno to dynamicznie dodać folder nadrzędny jako przedrostek do wszystkich plików pasujących do określonego wzorca, ale tylko wtedy, gdy nie ma już tego przedrostka.

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

kmpm
źródło