4 votes

Renommer une chaîne de caractères d'un nom de fichier sur la base d'une correspondance partielle dans le même dossier

J'ai un dossier rempli de fichiers (fichiers .avi et .txt) :

'MyVideo1-MyEncode.avi'
'MyVideo1.avi 16-05-2019 15-41-01.txt'

'My Video 2.avi'
'My Video 2.avi 16-05-2019 16-43-11.txt'

'My Video 3 [Summer]-MyEncode.avi'
'My Video 3 [Summer].avi 16-05-2019 17-57-24.txt'

'My Video 4-(Fall).avi'
'My Video 4-(Fall).avi 13-05-2019 19-29-16.txt'

'My Video 5-(Winter)-MyEncode.avi'
'My Video 5-(Winter).avi 11-05-2019 11-15-05.txt'

Si le fichier .avi comprend "-MyEncode" dans le nom de fichier, je voudrais ensuite copier cette partie de la chaîne dans le nom du fichier texte correspondant.

par exemple

"MyVideo1-MyEncode.avi" (Ma vidéo1-MyEncode.avi) comprend le texte "-MyEncode" dans le nom du fichier

donc : "MyVideo1.avi 16-05-2019 15-41-01.txt"

devrait être renommé en : "MyVideo1-MyEncode.avi 16-05-2019 15-41-01.txt"

d'autre part :

"Ma vidéo 2.avi" n'est pas contiennent la chaîne "-MyEncode", de sorte que le fichier .txt correspondant ne doit pas être renommé.

J'ai un certain nombre de dossiers contenant des fichiers de ce type.

Je pense que j'ai besoin d'exécuter la ligne cmd ou le fichier batch pour quelque chose comme :

for /R %x in (*.avi) do ren "%x" *.txt

mais cela ne tient pas compte de la correspondance partielle du nom de fichier.

Quelqu'un peut-il nous aider ?

PS - Si cela peut faciliter les choses, je peux renommer le fichier "My Video 3 [Summer]-MyEncode.avi" en "My_Video_3_[Summer]-MyEncode.avi" (c'est-à-dire supprimer les espaces).

4voto

mael' Points 1796

Cela s'est avéré être un véritable casse-tête pour moi, car la -MyEncode est placé au milieu du nom du fichier, mais c'est ce que j'ai trouvé et cela fonctionne sur la base des informations que vous avez fournies :

@echo off

set "dir=C:\Your\Directory"
set "enc=-MyEncode"

setlocal EnableDelayedExpansion
for /r "%dir%" %%A in ("*%enc%*.avi") do (
    set "sub=%%~nxA"
    set "name=!sub:~0,-13!"
    for /r "%dir%" %%B in ("*!name!*.txt") do (
        set "txt=%%~nxB"
        set "num=!txt:~-24!"
        set "fin=!name!!enc!.avi!num!"
        if not !txt!==!fin! ren "%dir%\!txt!" "!fin!"
    )
)
endlocal

Pour commencer, setlocal EnableDelayedExpansion est nécessaire car nous avons affaire à des variables utilisées tout au long de notre boucle for imbriquée. Ces variables sont utilisées pour rendre les choses un peu plus faciles à assimiler et à modifier lorsque vous revenez en arrière et que vous éditez, donc en premier lieu, j'ai défini des variables pour le répertoire dans lequel les fichiers sont situés ( dir ) et pour la chaîne de caractères que vous souhaitez insérer dans vos noms de fichiers ( enc ).

La boucle for initiale vérifie dans le répertoire toutes les instances de fichiers .avi qui contiennent la chaîne -MyEncode et pour chaque instance/itération un paramètre %%A est renvoyée et utilisée pour do quelques autres commandes. La première commande de la boucle initiale définit une variable ( sub ) avec le nom de fichier ( n ) et l'extension ( x ) de notre %%A paramètre - ce paramètre supprime toutes les informations relatives à l'annuaire puisque nous n'en aurons pas besoin. La deuxième commande utilise notre nouveau sub pour définir une variable plus récente ( name ) qui soustrait les 13 derniers caractères du nom de fichier (les 13 derniers étant -MyEncode.avi ) afin que nous puissions l'utiliser pour la partie suivante : la boucle for imbriquée.

Comme la boucle for initiale, notre boucle imbriquée regarde dans notre répertoire - mais au lieu de chercher les fichiers .avi contenant notre enc il recherche les fichiers .txt contenant notre nouvelle variable name variable. La première commande lors de l'établissement de la variable txt est de réduire les émissions de gaz à effet de serre et de réduire les émissions de gaz à effet de serre. %%B à son nom de fichier et à son extension, puis nous définissons une valeur de num qui réduit le nombre de txt à ses 24 derniers caractères (les chiffres et les espaces à la fin). Enfin, il définit la variable fin à ce que nous voulons que le nouveau fichier texte soit appelé : !name!!enc!.avi!num! - il s'agit du nom établi dans la boucle for initiale avec -MyEncode s'y ajoutent, un .avi puis les chiffres qui figuraient à l'origine à la fin. À partir de là, nous utilisons un if not de dire que : pour tous les txt qui ne sont pas déjà égales à leur fin renommez le fichier txt a fin . J'utilise if not car les fichiers texte qui ont déjà été modifiés pour refléter les fichiers .avi correspondants n'ont pas besoin d'être renommés à nouveau.

J'espère que cela vous aidera !

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X