Comment supprimer des caractères des noms de fichiers en utilisant la ligne de commande?

3

J'ai un tas de fichiers à renommer mais je ne veux pas en créer un, juste une ligne de commande.

Je dois supprimer les derniers chiffres entre . et .gif :

22771786_01.204.gif  
22771786_02.203.gif  
22771786_03.10.gif  
22771786_04.56.gif

Pour être comme ça:

22771786_01.gif  
22771786_02.gif  
22771786_03.gif  
22771786_04.gif
    
posée A.V 14.11.2017 - 16:50
la source

3 réponses

3

Vous pouvez réaliser ceci avec une boucle for et une extension bash. Si vous êtes déjà dans le répertoire contenant les fichiers:

for f in ./*; do mv "$f" "${f%.*.gif}.gif" ; done

Si votre répertoire contenant les fichiers s'appelle / home / gifstore /:

for f in /home/gifstore/*; do mv "$f" "${f%.*.gif}.gif" ; done

${f...} effectue l'extension de chaque nom de fichier que nous avons enregistré dans la variable nommée f . Le % dans l'extension du nom de fichier signifie supprimer la plus courte correspondance du modèle suivant à la fin de la variable. Le motif est .*.gif , c'est-à-dire n'importe quelle quantité de caractères entre . et .gif . Enfin, nous ajoutons la chaîne littérale .gif en dehors de l'extension pour créer notre nouveau nom de fichier, et nous nous appuyons sur la commande mv pour déplacer le fichier.

Cela ne fonctionnera pas pour les fichiers cachés, en commençant par . .

    
réponse donnée Arronical 14.11.2017 - 17:20
la source
1

La commande rename (vous pouvez également l'exécuter comme file-rename ) est bien adapté à cette tâche. Il y a plusieurs façons de l'utiliser ici. Je suggère ceci, bien que je montre une alternative ci-dessous:

rename -n 's/^\d{8}_\d\d\K\.\d+//' *.gif

L'option -n fait qu'il suffit d'imprimer ce que les opérations de renommage seraient les premières. Une fois que vous en êtes satisfait, exécutez-le à nouveau sans que -n effectue le changement de nom. L'un des avantages de rename est qu'il n'écrasera pas les fichiers (sauf si vous lui transmettez le%) option co_de%, ce que vous devriez faire très rarement). C'est particulièrement bien ici parce que vous supprimez des parties de noms de fichiers qui pourraient entraîner des collisions de noms. Même si les collisions ne sont pas détectées lorsque vous effectuez la simulation avec -f , elles seront interceptées lorsque vous effectuez le changement de nom réel.

Avec les quatre fichiers que vous avez montrés, cette commande affichera cette sortie:

rename(22771786_01.204.gif, 22771786_01.gif)
rename(22771786_02.203.gif, 22771786_02.gif)
rename(22771786_03.10.gif, 22771786_03.gif)
rename(22771786_04.56.gif, 22771786_04.gif)

Bien sûr, votre sortie sera plus longue si vous avez plus de quatre fichiers, ce que je suppose que vous faites.

La façon dont cette commande fonctionne est que -n effectue la substitution. Les noms de fichiers contenant du texte correspondant à la expression régulière s/ sont modifiés afin que la correspondance est effacée, c'est-à-dire remplacée par la chaîne vide comprise entre ^\d{8}_\d\d\K\.\d+ et / dans le / qui la suit.

Bien que l'expression régulière puisse être écrite de manière à garantir que seuls les fichiers se terminant par // sont utilisés, cela n'est pas nécessaire, car vous ne pouvez transmettre que les noms de fichiers .gif à .gif . Le shell développe rename dans une liste de ces fichiers et transmet cette liste à la commande *.gif . Notez que la syntaxe utilisée par le shell pour extension du nom de fichier est pas la même chose sous forme de expressions régulières . rename n'a pas la même signification que dans les expressions régulières.

Voici ce que l’expression régulière * fait:

  • ^\d{8}_\d\d\K\.\d+ ancres au début de la ligne.
  • ^ correspond à une séquence de exactement huit chiffres .
  • \d{8} correspond à un littéral _ . Ce n'est pas spécial.
  • _ correspond à deux chiffres supplémentaires.
  • \d\d oublie les caractères correspondants précédents . Ce sont les caractères que nous voulons conserver, après tout, pas ceux que nous voulons remplacer. L'effet est de s'assurer que ces caractères sont présents juste avant le rôle que nous remplacerons réellement.
  • \K correspond à un littéral \. . La barre oblique inverse est nécessaire car lorsqu'un point apparaît dans une expression régulière, sinon correspond à un seul caractère tout .
  • . correspond à un ou plusieurs chiffres .

Il s’agit donc d’un \d+ suivi des chiffres supprimés. Si le fichier ne commence pas par le motif nécessaire, il n'y a pas de correspondance. Cela permet d'éviter de renommer des fichiers que vous ne souhaitez pas renommer.

Il est possible d’écrire une commande . plus courte qui devrait fonctionner. J'ai choisi cette approche - parmi les nombreuses approches possibles - car la commande exprime précisément le schéma de nommage sur lequel vous souhaitez opérer. Cela signifie que la solution ressemble au problème.

Si vous souhaitez utiliser une commande rename plus simple et que vous savez que tous les fichiers rename du répertoire en cours sont nommés en fonction de votre description et doivent être renommés, vous pouvez utiliser:

rename -n 's/\.\d+\.gif$/\.gif/' *

Rappelez-vous que .gif vous montre simplement ce qui sera fait et que vous devez ensuite le supprimer pour renommer les fichiers.

Dans cette commande, j'ai inclus le suffixe -n dans l'expression régulière, vous n'avez donc pas à filtrer dans le nom des fichiers que vous transmettez à .gif . Cependant, vous pouvez choisir de le faire si vous avez beaucoup de fichiers non rename dans le répertoire en cours qui pourraient correspondre à .gif .

Voici ce que l’expression régulière * fait:

  • \.\d+\.gif$ correspond à un littéral \. . (Sans . , \ correspond à n'importe quel caractère .)
  • . correspond à un ou plusieurs chiffres .
  • \d+ correspond à un autre littéral \. .
  • . correspond au texte littéral gif .
  • gif anchors la correspondance avec la fin du nom de fichier.

Ainsi, le point, les chiffres finaux et le suffixe $ sont mis en correspondance et tous remplacés par .gif .

    
réponse donnée Eliah Kagan 14.11.2017 - 17:30
la source
0

J'aime personnellement utiliser Ranger pour ce type de choses. Il utilise des raccourcis clavier Vim pour la navigation et autres, donc si vous n'êtes pas familier avec vim, cela peut être compliqué / difficile. Mais si vous connaissez déjà Vim, la tâche devrait être simple!

Étape 1

Installez ranger . Vous pouvez l’installer en tant que plug-in Vim ou simplement télécharger le fichier .tar.gz depuis website .

Étape 2

Exécutez Ranger et accédez au répertoire contenant les fichiers à renommer. Je recommanderais de mettre tous les .gif dans un répertoire. Assurez-vous qu'il n'y a pas d'autres fichiers à l'exception de ceux que vous souhaitez renommer.

Étape 3

Appuyez sur v pour sélectionner tous les fichiers

Étape 4

tapez :bulkrename et appuyez sur Enter

Étape 5

Utilisez une macro Vim pour enregistrer les modifications que vous souhaitez apporter. Donc, pour votre exemple, si vous avez démarré sur la toute première ligne du fichier, vous utiliseriez ces commandes:

q a (cela démarre la macro nommée "a")

0 , f. , de (déplace le curseur au début de la ligne, trouve le premier ".", puis supprime le dernier caractère avant le second "." avant gif)

q (pour arrêter l'enregistrement de la macro)

Étape 6

Passez à la deuxième ligne et déplacez le curseur au début de la ligne ( j , 0 ) et tapez :2,$norm! @a

Cela exécutera la macro que vous venez de créer (nommée "a") de la deuxième ligne jusqu’à la fin du fichier.

Étape 7

:wq pour enregistrer et quitter, puis :wq à nouveau pour confirmer les modifications.

Donc, si tout va bien, vous devriez avoir renommé tous vos fichiers. Si vous n'avez jamais utilisé Vim auparavant, je vous recommande d'utiliser une autre réponse pour que vous n'ayez pas à apprendre Vim simplement pour renommer les fichiers. Je préfère utiliser Vim, c'est donc ma méthode de choix en cas de renommage en masse.

    
réponse donnée RandomlyRainy 14.11.2017 - 18:31
la source

Lire d'autres questions sur les étiquettes