web-dev-qa-db-fra.com

Renommez plusieurs fichiers dans un dossier, ajoutez un préfixe (Windows)

Je voudrais renommer par lots les fichiers d'un dossier, en préfixant le nom du dossier dans les nouveaux noms les fichiers dans C:\house chores\ seront tous renommés house chores - $old_name.

52
ofer.sheffer

Option 1: utilisation de Windows PowerShell

Ouvrez le menu Windows. Tapez: "PowerShell" et ouvrez la fenêtre de commande "Windows PowerShell".

Aller au dossier avec les fichiers souhaités: par exemple cd "C:\tâches domestiques" Remarque: l'adresse doit comporter des guillemets "" s'il y a des espaces impliqués.

Vous pouvez utiliser 'dir' pour voir tous les fichiers du dossier. Utiliser '|' pipeline la sortie de 'dir' pour la commande qui suit.

Notes: 'dir' est un alias de 'Get-ChildItem'. Voir: wiki: cmdlets . On peut fournir des fonctionnalités supplémentaires. par exemple. 'dir -recurse' affiche tous les fichiers, dossiers et sous-dossiers.

Et si je veux seulement une gamme de fichiers? 

Au lieu de 'dir |' Je peux utiliser:

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

Pour renommer des lots avec le nom du répertoire comme préfixe:

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

Option 2: utilisation de l'invite de commande

Dans le dossier, appuyez sur shift + clic droit: sélectionnez "ouvrir la fenêtre de commande ici"

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

S'il y a beaucoup de fichiers, il peut être judicieux d'ajouter une commande "@echo off" avant cela et une commande "echo on" à la fin.

107
ofer.sheffer

Le problème avec les deux réponses de Powershell ici est que le préfixe peut être dupliqué puisque le script s'exécute potentiellement sur le fichier avant et après qu'il ait été renommé, en fonction du répertoire utilisé lors de l'exécution du processus de changement de nom. Pour contourner cela, utilisez simplement l'option -Exclude:

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

Cela empêchera le processus de renommer un fichier plus d'une fois.

23
Dave.Gugg

Logiciel libre ' Utilitaire de changement de nom en bloc ' fonctionne également bien (et est également puissant pour les tâches avancées). Téléchargement et l'installation prend une minute.

Voir captures d'écran et tutoriel sur le site Web d'origine.

-

Je ne peux pas fournir de captures d'écran étape par étape, car les images devront être publiées sous Creative Commons License , et je ne suis pas propriétaire des captures d'écran du logiciel.

Déni de responsabilité: Je ne suis en aucun cas associé à ce logiciel/cette entreprise. J'ai aimé le produit pour ma propre tâche, il répond aux exigences des opérateurs et des exigences similaires, donc à la recommandation.

12
user216084

Cela a fonctionné pour moi, tout d'abord cd dans le répertoire dans lequel vous souhaitez modifier les noms de fichiers puis exécutez la commande suivante:

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

J'étais en train de m'arracher les cheveux, car pour certains éléments, l'élément renommé le serait à nouveau (à plusieurs reprises, sauf si la longueur maximale du nom de fichier était atteinte). Cela se produisait à la fois pour Get-ChildItem et pour acheminer la sortie de dir. Je suppose que les fichiers renommés ont été ramassés à cause d’un changement d’ordre alphabétique. J'ai résolu ce problème de la manière suivante:

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

Ceci "verrouille" les résultats renvoyés par Get-ChildItem dans la variable $ dirs et vous pouvez les parcourir sans crainte que la commande ne change ou que d'autres affaires amusantes ne se produisent.

Le conseil de Dave.Gugg concernant l'utilisation de -Exclude devrait également résoudre ce problème, mais il s'agit d'une approche différente. peut-être si les fichiers en cours de renommage contiennent déjà le motif utilisé dans le préfixe.

(Avertissement: je suis vraiment un PowerShell n00b.)

1
phantom-99w

Basé sur @ ofer.sheffer, cette commande va renommer en masse et ajouter la date actuelle au nom du fichier. C'est-à-dire que "fichier.txt" devient "20180329 - fichier.txt" pour tous les fichiers du dossier actuel

for %a in (*.*) do ren "%a" "%date:~-4,4%%date:~-7,2%%date:~-10,2% - %a"
1
karpa

Je sais que c’est une vieille question, mais j’ai beaucoup appris des diverses réponses, mais j’ai proposé ma propre solution en guise de fonction. Cela devrait ajouter dynamiquement le dossier parent en tant que préfixe à tous les fichiers correspondant à un certain modèle, mais uniquement s'il ne possède pas déjà ce préfixe.

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

0
kmpm

Sur la base de la réponse @ ofer.sheffer, il s'agit de la variante CMD permettant d'ajouter un affixe (ce n'est pas la question, mais cette page reste le premier résultat de Google si vous recherchez un affixe). C'est un peu différent à cause de l'extension.

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

Vous pouvez changer la partie "-affix".

0
roverv