web-dev-qa-db-fra.com

Renommer (ou supprimer le préfixe) plusieurs fichiers en leur numéro

J'essaie de changer tous les noms de fichiers dans un dossier en cours et j'essaye d'y parvenir en supprimant le préfixe des fichiers (chaque fichier a un préfixe commun) ou en changeant leurs noms en leur nombre (s'il y a 5 fichiers, les noms de fichiers sera 1.txt 2.txt 3.txt 4.txt 5.txt).

Maintenant, j'ai trouvé la commande ren dans cmd et j'ai joué un peu avec, mais jusqu'à présent, je n'ai pas pu obtenir le résultat et je ne peux l'exécuter qu'en cmd, donc aucun fichier batch ne peut être utilisé.

C'est le plus proche que j'ai obtenu, mais cela n'ajoute qu'un préfixe:

FOR %f IN (*.*) DO ren %f prefix%f

J'ai essayé de faire le contraire:

FOR %f IN (*.*) DO ren prefix%f %f

Mais bien sûr, cela n'a pas fonctionné, je demande maintenant de l'aide et des explications si possible (j'aime comprendre comment ces choses fonctionnent). Merci d'avance pour votre aide.

16
Shadow

Je ne comprends pas pourquoi vous ne pouvez pas utiliser un fichier batch. Mais voici une solution qui devrait fonctionner avec la plupart des noms de fichiers.

Critique - vous devez d'abord vous assurer que vous avez un nom de variable non défini, je vais utiliser fname

set "fname="

Vient ensuite la commande pour effectuer le changement de nom. Cela ne fonctionnera pas correctement si fname est déjà défini.

for %a in (prefix*.txt) do @(set "fname=%a" & call ren "%fname%" "%fname:*prefix=%")

La variable fname est définie pour chaque itération puis la syntaxe %fname:*prefix=% remplace la première occurrence de "prefix" par rien. La chose délicate est que Windows essaie d'abord de développer% fname% lors de la première analyse de la commande. Bien sûr, cela ne fonctionnera pas car il n'a pas encore été défini. Sur la ligne de commande, les pourcentages sont conservés si la variable n'est pas trouvée. L'appel provoque une phase d'expansion supplémentaire qui se produit après la variable a été définie, donc l'expansion fonctionne.

Si fname est défini avant d'exécuter la commande, il essaiera simplement de renommer ce même fichier pour chaque itération au lieu de la valeur qui est affectée dans la boucle.

Si vous souhaitez réexécuter la commande avec un préfixe différent, vous devrez d'abord effacer à nouveau la définition.

EDIT - Voici un fichier batch nommé "RemovePrefix.bat" qui fait le travail

::RemovePrefix.bat  prefix  fileMask
@echo off
setlocal
for %%A in ("%~1%~2") do (
  set "fname=%%~A"
  call ren "%%fname%%" "%%fname:*%~1=%%"
)

Supposons que vous ayez des fichiers nommés comme "prefixName.txt", alors vous utiliseriez le script en exécutant

RemovePrefix  "prefix"  "*.txt"

Le fichier de commandes renomme les fichiers de votre répertoire actuel. Le fichier de commandes devra également se trouver dans votre répertoire actuel, sauf si le fichier de commandes existe dans un répertoire qui se trouve dans votre variable PATH. Ou vous pouvez spécifier le chemin d'accès complet au fichier de commandes lorsque vous l'appelez.

Les règles d'expansion sont différentes dans un fichier de commandes. Les variables FOR doivent être référencées comme %% A au lieu de% A, et %% fname %% n'est pas développé initialement, à la place les doubles pourcentages sont convertis en pourcentages simples puis% fname% est développé après l'appel. Peu importe si fname est déjà défini avec le fichier de commandes. SETLOCAL rend la définition de fname temporaire (locale) dans le fichier de commandes.

31
dbenham

Une solution beaucoup plus simple est fournie dans
https://superuser.com/a/871799/497147

Je l'ai copié ici pour un accès plus facile.

Oubliez les scripts compliqués pour cela.

rename est une commande très ancienne et jamais correctement exécutée. Si vous ne l'utilisez pas correctement, le résultat pourrait vous surprendre.

Par exemple, pour supprimer un préfixe abcd de abcd1.txt, abcd2.txt, abcd3.txt etc. pour obtenir 1.txt, 2.txt, 3.txt utilisez simplement

rename "abcd*.txt" "////*.txt"

Vous avez besoin du même nombre de / comme nombre de caractères initiaux que vous souhaitez supprimer.

Placez des guillemets doubles pour les deux arguments.

35
Alnair