2 votes

Renommer plusieurs fichiers à la fois, avec la même extension

Je suis actuellement dans une situation où je dois renommer un groupe de fichiers, dans différents dossiers, avec la même extension (SRT).

Actuellement, mon répertoire "setup" est comme ceci :

This is a folder (2000)
   - This.is.a.folder.2000
     - This.is.a.folder.2000.wmv
     - This.is.a.folder.2000.txt
     - This.is.a.folder.2000.srt

This is also a folder (2001)
   - This.is.also.a.folder.2001
     - This.is.also.a.folder.2001.wmv
     - This.is.also.a.folder.2001.txt
     - This.is.also.a.folder.2001.srt

Et je dois renommer les fichiers SRT pour qu'ils soient comme ça :

This is a folder (2000)
   - This.is.a.folder.2000
     - This.is.a.folder.2000.wmv
     - This.is.a.folder.2000.txt
     - This.is.a.folder.2000.en.srt

This is also a folder (2001)
   - This.is.also.a.folder.2001
     - This.is.also.a.folder.2001.wmv
     - This.is.also.a.folder.2001.txt
     - This.is.also.a.folder.2001.en.srt

Y a-t-il un moyen d'y parvenir ? J'utilise un serveur Ubuntu, avec seulement un terminal disponible.

Si quelqu'un peut m'aider à ce sujet, je lui en serai très reconnaissant :).

3voto

dessert Points 36815

Vous pouvez utiliser bash 's globstar option, activée avec shopt -s globstar :

S'il est défini, le motif ** utilisé dans un contexte d'expansion de nom de chemin correspondra à tous les fichiers et à zéro ou plusieurs répertoires et sous-répertoires.

printf '%s\0' **/*.srt | xargs -0 rename 's/srt$/en.$&/'

Ceci construit une liste délimitée par zéro de chaque fichier correspondant à *.srt dans ou sous le répertoire courant et le transmet à xargs qui fonctionne rename aussi souvent que nécessaire. Le site rename L'expression remplace le "srt" final par "en." suivi de la chaîne de caractères correspondante ( $& ).

Exemple d'exécution

$ tree
.
 1
    test.srt
 2
    3
        test.srt
 srt.srt
 test.srt
$ shopt -s globstar
$ printf '%s\0' **/*.srt | xargs -0 rename 's/srt$/en.$&/'
$ tree
.
 1
    test.en.srt
 2
    3
        test.en.srt
 srt.en.srt
 test.en.srt

2voto

steeldriver Points 118154

Si votre système n'a pas rename (ou a le mauvais rename 1 ), alors vous pouvez faire ce type particulier de remplacement facilement avec l'expansion du paramètre Shell. ${f%.srt} pour supprimer la queue .srt von $f :

find path/to/dir -name '*.srt' -execdir sh -c '
  for f; do echo mv "$f" "${f%.srt}.en.srt"; done
' sh {} +

Retirer le echo une fois que vous êtes heureux qu'il fasse la bonne chose.

  1. Qu'est-ce que c'est que tous ces renommages : prénoms, renommages, renommages de fichiers ?

0voto

vanadium Points 56513

Voir le question de duplication pour l'approche globale. Vous devez évidemment l'adapter à vos besoins spécifiques :

  • Pour les paramètres de rename vous pouvez fournir 's/\.srt/\.en\.srt/' qui cherchera .srt et changer par .en.srt .
  • Pour travailler de manière plus sûre (et probablement plus rapide), limitez-vous à localiser uniquement vos .srt . dossiers. Dans ce but, ajoutez l'élément -name '*.srt' à la commande find.
  • Testez d'abord en ajoutant le -n à la commande rename. Cela montre comment les renommages seront effectués sans les réaliser réellement. Si tout semble correct, exécutez à nouveau la commande sans l'option -n option.

La commande, basée sur le post qui posait également une question similaire, ressemblera à ceci

find /path/to/parrent-dir -type f -name '*.srt' -exec rename -n 's/\.srt/.en.srt/' {} +

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