web-dev-qa-db-fra.com

Renommez plusieurs fichiers .txt en changeant certains caractères dans des positions spécifiques

J'ai une collection de centaines de fichiers . Txt dans le même dossier dans Ubuntu 16.04, et ils sont nommés avec des chaînes et des numéros d'index, comme celui-ci:

a01_s01_e01_skeleton.txt
a01_s01_e02_skeleton.txt
a01_s01_e03_skeleton.txt
a01_s02_e01_skeleton.txt
...
a20_s10_e02_skeleton.txt
...

Je dois supprimer le fichier (zéros) de chaque .txt dont le nombre est inférieur à 10, donc, à la fin, j'aurai:

instead of : a01_s01_e01_skeleton.txt 

it will be: a1_s1_e1_skeleton.txt #notice that the 0s are gone. 

EDIT

La position des nombres est toujours la même, comme dans les exemples. Les fichiers ont une logique d’ordre, le processus de changement de nom doit donc être totalement correct.

Comment pourrais-je faire cela en utilisant la ligne de commande?

5
Elisa Maria Alves

Ok, juste pour le plaisir, il y a sans doute des solutions CLI plus courtes, mais en python, le script ci-dessous fait le travail if le répertoire est "à plat" (comme vous dites) et = tous les fichiers qu'il contient sont des fichiers valides à renommer. Sinon, nous devons ajouter une exception, alors allons-y:

import shutil
import sys
import os

dr = sys.argv[1]

for f in os.listdir(dr):
    sections = f.split("_")
    newname = "_".join(
        [s[0] + str(int(s[1:])) for s in sections[:3]] + [sections[-1]]
    )
    shutil.move(os.path.join(dr, f), os.path.join(dr, newname))

Utiliser:

  • Copiez le code dans un fichier vide, enregistrez-le sous rename_stuff.py
  • Exécutez-le avec le répertoire comme argument:

    python3 /path/to/rename_stuff.py </directory/with/files>
    

Comme toujours, essayez d’abord un exemple de répertoire.

Explication

  • Lire les fichiers dans le répertoire:

    for f in os.listdir(dr):
    
  • Découpez le nom par "_":

    sections = f.split("_")
    
  • Sur les trois premières sections, remplacez les deux chiffres (ou plus) par leur valeur int- ("réelle"), ainsi 01 -> 1, 10 -> 10, 020 -> 20, 000300 -> 300, etc. .

  • Ensuite, recoller les sections ensemble:

    newname = "_".join(
        [s[0] + str(int(s[1:])) for s in sections[:3]] + [sections[-1]]
    )
    
6
Jacob Vlijm

Avec Perl rename, vous pouvez supprimer les zéros qui se produisent entre un non-chiffre et un chiffre.

$ touch a01_s01_e01_skeleton.txt a01_s01_e02_skeleton.txt a01_s01_e03_skeleton.txt a01_s02_e01_skeleton.txt a20_s10_e02_skeleton.txt
$ rename -n 's/(?<=\D)0+(?=\d)//g' *.txt
rename(a01_s01_e01_skeleton.txt, a1_s1_e1_skeleton.txt)
rename(a01_s01_e02_skeleton.txt, a1_s1_e2_skeleton.txt)
rename(a01_s01_e03_skeleton.txt, a1_s1_e3_skeleton.txt)
rename(a01_s02_e01_skeleton.txt, a1_s2_e1_skeleton.txt)
rename(a20_s10_e02_skeleton.txt, a20_s10_e2_skeleton.txt)

rename peut ou peut ne pas être la version Perl. Sur mon système, il s’appelle file-rename et son lien symbolique est /usr/bin/rename.

8
glenn jackman

Shellscript

En utilisant renamealias rename.ul installé à partir du paquet util-linux, j'ai créé le shellscript bash suivant, qui, je pense, peut faire le travail à votre place.

#!/bin/bash

#####################


doer () {

# removes "0" from the string "{parameter}0"
# for example a0 --> a

 rename "s/${1}0/$1/" *
}
#####################

# main

#####################

doer a
doer s
doer e

Appelons le shellscript renameret accordons-lui des autorisations d'exécution.

Si les zéros à supprimer sont précédés de lettres autres que a, s, e, veuillez ajouter un appel de doeravec ces lettres dans le script et modifier le shellscript, s’il existe des instances, non représentées par vos exemples de noms de fichiers, qui nécessitent davantage les détails dans la spécification de substitution (la fonction doername__).

Tester

Créer et vérifier les fichiers "originaux"

$ touch a01_s01_e01_skeleton.txt a01_s01_e02_skeleton.txt a01_s01_e03_skeleton.txt a01_s02_e01_skeleton.txt a20_s10_e02_skeleton.txt
$ ls -1
a01_s01_e01_skeleton.txt
a01_s01_e02_skeleton.txt
a01_s01_e03_skeleton.txt
a01_s02_e01_skeleton.txt
a20_s10_e02_skeleton.txt
renamer

Exécuter le script de shell

$ ./renamer

Vérifier le résultat

$ ls -1
a1_s1_e1_skeleton.txt
a1_s1_e2_skeleton.txt
a1_s1_e3_skeleton.txt
a1_s2_e1_skeleton.txt
a20_s10_e2_skeleton.txt
renamer
$ 
5
sudodus

L'utilitaire de changement de nom de Perl est la meilleure option pour cela, je pense.

rename 's/(\w)0(\d)/$1$2/g' *.txt

Cette commande remplacera toutes les occurrences d'une lettre suivie d'un zéro suivi d'un chiffre, en conservant la lettre et le chiffre tout en supprimant le zéro, pour chaque fichier texte du répertoire en cours.

2
Bruce H

Utiliser zsh:

autoload zmv
zmv 'a(<->)_s(<->)_e(<->)_skeleton.txt' 'a${1#0}_s${2#0}_e${3#0}_skeleton.txt'
1
Roman Odaisky