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?
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))
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.
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]]
)
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
.
En utilisant rename
alias 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 renamer
et 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 doer
avec 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 doer
name__).
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
$
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.
Utiliser zsh:
autoload zmv
zmv 'a(<->)_s(<->)_e(<->)_skeleton.txt' 'a${1#0}_s${2#0}_e${3#0}_skeleton.txt'