web-dev-qa-db-fra.com

Renommez plusieurs fichiers en même temps

J'ai environ 180 fichiers avec la même structure: 000-aaaaaaaa.txt.

Expression régulière pour un nom de fichier: /^[0-9]{3}\-[a-zA-Z]+$/gi (3 chiffres + - + lettres + .txt).

Je voudrais couper la partie numérique et - Dans chaque nom de fichier

Par exemple

  • 000-hello.txt -> hello.txt
  • 001-world.txt -> world.txt
  • 002-ubuntu.txt -> ubuntu.txt
  • 003-linux.txt -> linux.txt
9
Max Mikhalchuk

Avec Perl-Basé rename commande:

$ rename -n 's/\d{3}-//' [0-9][0-9][0-9]-*.txt
rename(000-hello.txt, hello.txt)
rename(001-world.txt, world.txt)
rename(002-ubuntu.txt, ubuntu.txt)
rename(003-linux.txt, linux.txt)

Si le nombre de fichiers est suffisamment grand pour que la commande dépasse la coque ARG_MAX, alors vous pourriez utiliser soit

printf '%s\0' [0-9][0-9][0-9]-*.txt | xargs -0 rename -n 's/\d{3}-//'

ou alors

find . -maxdepth 1 -name '[0-9][0-9][0-9]-*.txt' -exec rename -n 's/\d{3}-//' {} +

Notez que [0-9][0-9][0-9]-*.txt est traitée par la coquille et doit être une expression de globules de coquille plutôt qu'une expression régulière.

Retirer le -n Une fois que vous êtes heureux de faire la bonne chose.

13
steeldriver

Puisque je ne vois pas cela mentionné ici encore, vous pouvez utiliser reproduction . Bien que cela ne soit pas installé par défaut, il prend en charge le renommage du fichier d'expression régulier. Vous pouvez faire juste un seul modèle d'expression régulier comme si:

repren --rename --from "^[0-9]{3}" --to "" --dry-run .

L'exemple ci-dessus supprime les 3 premiers chiffres de tous les noms de fichiers s'ils sont au début de celui-ci pour tous les fichiers récursivement dans le répertoire actuel. Il fait un Run cependant pour vous montrer ce qu'il va faire sans le faire - supprimer le --dry-run bit une fois que vous êtes sûr que cela fera ce que vous avez l'intention.

repren prend également en charge les fichiers de modèle , vous permettant de faire plusieurs remplacements dans 1 Go:

repren --rename --patterns=path/to/patternfile

Un fichier de modèle ressemble à ceci:

regex_1<tab_character>replacement_1
regex_2<tab_character>replacement_2

...etc.

Enfin, il soutient des groupes d'expression réguliers. Considérez ce fichier de modèle:

# This is a comment
figure ([0-9+])<tab>Figure \1

Le \1 Syntaxe insère le contenu de la première (bracketed) grouper. Pour ce faire sur la ligne de commande, vous devez utiliser des guillemets simples, je pense (corrigez-moi si je me trompe):

repren --rename --from 'figure ([0-9+])' --to 'Figure \1' --dry-run path/to/directory_or_files_here

Cela vient de gratter la surface de ce que repren est capable de cependant. Il peut éventuellement modifier le contenu des fichiers également (d'où la nécessité de --rename Dans tous les exemples ci-dessus).

Disclaimer: Je ne suis pas affilié à repren ou de développement de quelque manière que ce soit, je trouve simplement un outil de sauvegarde de temps inestimable.

2

Je sais que la question est étiquetée avec la ligne de commande, mais si un outil d'interface graphique vous sera utile, le gestionnaire de fichiers thunar dispose d'un excellent outil de renommée en vrac. Vous pouvez installer Thunar directement à partir de votre gestionnaire de packages. Une fois qu'il est installé, sélectionnez les fichiers d'intérêt, puis allez sur "Renommer" dans le menu Edition.

Un grand avantage de Thunar est qu'il vous donne un aperçu des nouveaux noms. Vous n'avez donc pas besoin d'obtenir votre commande ou votre expression exactement la première fois. Il peut également faire renommer des tâches qui dépassent la compétence des regex, comme l'insertion de nombres consécutifs dans les noms de fichiers.

Il y a plus d'informations sur Thunar sur le Site Web de l'emballage Ubunt . Le magazine Software gratuit a un bon article d'ensemble à ce sujet aussi avec des captures d'écran.

1
Jadrian Miles