Renommer des fichiers contenant [ ] dans le nom

Bonjour,
Voila j’ai des fichiers de ce type : « fichier134_[bazar].mp4 » que je voudrais transformer en : « fichier134_.mp4 » donc simplement enlever les [] et ce qu’ils contiennent…
Je n’arrive pas a utiliser la fonction rename pour ca. Peut etre y a mieux ?!
Merci

krename ?

non simplement rename

te fauit une ligne de colmmande plus complexe que rename simplement.
Il te faut être plus précis: quel est la structure du nom du fichier?
QEst-ce:

  • Fichier134_[.*].mp’ ?
  • fichier*_[*].mp4?
    Etc…

rename ne permet pas d’utiliser des regexp donc il faut scripter (deux ou trois lignes tout au plus).

ce qui s'exprime clairement se comprend aisément :wink:

Je pense plutôt un petit script en Python mais je ne doute pas qu’un pro d’awk qui passe par là pondra une solution imbitable en une ligne.

Un canon pour tuer une mouche :wink:

Une boucle de type

for $f in <recupération de la liste des fichiers>
do
 $fnew=<determination du nouveau nom)
 rename $f $fnew
done

c’est suffisant. Sachant que cela peut impliquer d’utiliser awk et/ou sed :slight_smile:

disons que j’ai 3 fichiers :
Bruno[az18sdh].mp4
Franck[juri99].mp4
Serge[8juin].mp4
J’aimerais qu’en quelques lignes de commandes, je change les noms de fichiers en :
Bruno.mp4
Franck.mp4
Serge.mp4
Voila!

Pour test:

$ mkdir /tmp/test ; cd /tmp/test
$ touch Bruno[az18sdh].mp4 Franck[juri99].mp4 Serge[8juin].mp4

$ for x in *.mp4 ; do mv "$x" "$(sed 's/\[.*\]//' <<< "$x")" ; done

$ ls
  Bruno.mp4  Franck.mp4  Serge.mp4
2 J'aime

OK merci, ca marche comme je le souhaitais !
super

C’est toujours plus simple avec des exemples concrets pour tester.

Sinon si ‹ sed › parait trop intriguant, avec bash, il y a en fait plus simple avec directement:

for x in *.mp4 ; do mv "$x" "${x/\[*\]/}" ; done

ou mieux si tu as un mélange non homogène, autre que des xyz[abcd].mp4

for x in *.mp4 ; do y="${x/\[*\]/}"; [ -f "$y" ] || mv "$x" "$y" ; done
2 J'aime

étonnant
Tu as quelques part une doc détaillée?

Bonjour,
Avec rename. (à installer si nécessaire)
rename -n 's/\[.*?\]//' *mp4
à exécuter depuis le répertoire concerné . Cette commande est une simulation, pour qu’elle renome réellement les fichiers enlève l’option -n

2 J'aime

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