Renommer des fichiers contenant [ ] dans le nom

Tout est détaillé à la rubrique ‹ Parameter Expansion › du man bash.

La difficulté quand on se disperse dans les micro-commandes supplémentaires est que ce qui simplifie le traitement de cas simples, peut le compliquer pour des cas plus complexes.
‹ rename › non seulement est un paquet supplémentaire, mais dépend aussi du paquet Perl, et n’évacue pas la nécessité de savoir quelle expression regex produira l’effet désiré (le plus dur est en fait là…).
On peut vite se noyer dans les différents types de regex ou de globbing, selon les options de configuration de Bash, par défaut, ou pas. Vite un casse-tête.

sed → Basic (BRE) regular expression par défaut → sed / BRE
sed 's/\[.*\]//' <<< "$x"

bash → globbing
"${x/\[*\]/}"

rename → regex PERL
's/\[.*\]//' (le ‹ ? › n’était pas nécessaire)

Mais rename est sympa pour les cas simples, évitant une boucle for/done.

2 J'aime

Pour ma part, comme les fois où je me suis confronté aux regex j’eus utilisé essentiellement le module Re de python, rename me convient et a jusqu’à présent toujours satisfait à mes demandes.

@Zargos , il n’est pas utile de faire appel à awk et/ou sed si l’on passe par Python. Le module de base Python re pour les expressions régulières fera très bien l’affaire.

Quand à utiliser Python au lieu d’un script bash s’appuyant sur awk/sed pour faire juste ceci, c’est vrai que c’est un peu d’hommage car ce qui est Linuxien n’est pas forcément Pythonien, ou inversement.

Pour ma part, comme les fois où je me suis confronté aux regex j’eus utilisé essentiellement le module Re de python,

Les expressions régulières se retrouvent aussi bien dans l’outil sed que le langage awk ou le module de base Python re. Il s’agit de rédiger l’expression régulière appropriée: au regard de la simplicité du problème, les différences éventuelles entre sed, awk, et Python, seront minimes ou inexistantes.
Une fois l’expression régulière trouvée, il devient aisé de changer la chaîne de caractères concernée, en l’occurrence le nom du fichier, avec l’outil ou le langage de son choix. Au niveau clarté ou lisibilité du code, dans le cas présent j’ai une préférence pour Python. Si l’opération entre plus dans le cadre de l’administration d’un système Unix/Linux que le réel développement d’une application, alors ma préférence va à sed au sein d’un script bash. En dernier lieu, j’utiliserai awk et sa commande sub si le script devient trop lourd en bash avec sed ou si je veux aller plus rapidement à l’essentiel: awk est en mesure de traiter automatiquement une liste de noms de fichiers placés dans un fichier sans avoir à écrire la moindre boucle; chaque ligne d’un script awk étant appliqué à toutes les lignes du fichier donné en dernier argument.

Python est très largement installé dans Linux. Dans Windows, en revanche…

Personnellement j’utilise souvent perl pour les expression régulière, celui-ci étant devenu un standard de fait ( et qui a permis de créer PCRE).
Python est plus limité car je crois qu’il se cantonne au POSIX avec quelques différences ponctuelles.

À propos :

> file /bin/rename
/bin/rename: symbolic link to /etc/alternatives/rename
> file /etc/alternatives/rename
/etc/alternatives/rename: symbolic link to /usr/bin/file-rename
> file /usr/bin/file-rename 
/usr/bin/file-rename: Perl script text executable

Le module Re (gérant les expressions régulières) est aussi basé sur le standard perl

Il me semble que rename est un script Perl qui utilise les regex évolués de Perl:

rename 's/\[machin\]//' truc\[machin\].txt

rename 's/\[machin\]//' truc\[*\].txt

fonctionnent chez moi

Ne pas oublier les «’» avant et après la commande de substitution, ni le «\» avant les crochets droits qui, sinon, sont un couple opérateur de regroupement de caractères.

le man n’est pas très explicite sur le sujet avec tout de même le fait qu’il soit lié à glibc.

https://manpages.debian.org/bookworm/rename/file-rename.1p.en.html

je voudrais bien un sondage pour savoir qui a un OS sans Perl installé :wink:
sinon le paquet une fois installé pèse 61,0 ko, terrifiant

1 J'aime

le paquet deb ne dépend que de Perl:any (Perl étant toujours installé), je ne vois libc signalé ni dans la description du package ni dans le man qui précise bien que l’argument perlexpr est une expression Perl.

Parle-t-on vraiment de la même commande «rename» installé par le package du même nom ?

C’est ce qu’on obtient en faisant man rename.
mais il y a rename.ul et puis si tu installes le paquedt rename tu installes une interface pour File::Rename.
Sinon sans ça il y a la commande rename.ul qui vient de util-linux

Oui, si on n’a pas installé le paquet rename, script Perl. (je viens de le supprimer et man rename affiche bien alors la page de cette fonction de Libc à laquelle vous vous référez).

Conclusion: pour utiliser « rename PerlRegex fichiers», très confortable, il faut installer le package rename de Debian.
Cette commande bénéficie d’une option -n qui permet de voir, par sécurité, ce qui va être fait, sans rien modifier.
Je m’en sers presque quotidiennement depuis des années.
Il existe aussi «detox» pour supprimer les caractères bizarres et les espaces dans les noms de fichier.

1 J'aime

le x dans le code est bien le x de for x in *mp4 ?

C’est le nom de la variable. Exemple de substitution simple où l’on change ‹ X › en ‹ e › :

fab@fabien:~$ variable="azXrty"
fab@fabien:~$ echo "${variable/X/e}"
azerty
fab@fabien:~$
1 J'aime

c’est bien ça , merci.

L’avantage du script Perl rename est de se passer de la boucle for, puisqu’il s’applique à une liste, comme « *.mp4 », et de bénéficier du confort et de la précision des regex de Perl, par exemple éviter le syndrome des barres-obliques.

https://perldoc.perl.org/perlfaq6

Pour ceux qui ne connaissent pas, vous pouvez essayer votre expression rationnelle PCRE (Perl Compatible Regular Expressions, comme celles utilisées par la cmd rename , grep -P ou avec le module Re de python) sur le site regex101 regex101: build, test, and debug regex .

on ne le sait souvent pas , mais avec sed on peut utiliser à peu près n’importe quel symbol à la place des / , j’utilise presque toujours #, ce qui donne par exemple sed 's#machin#truc#'

1 J'aime