Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#1 Le 26/02/2021, à 15:18

NY152

Renommer par lot à travers une arborescence

Bonjour,

Je cherche à renommer en bash tous une série de fichiers dans une arborescence.

En gros tous les fichiers de type file.txt.tmp doivent se voir retirer l'extension .tmp sans retirer la sous-extension (.txt)

Si quelqu'un peut m'aider sur ce bash, ce serait sympa

D'avance, merci

Hors ligne

#2 Le 26/02/2021, à 16:50

Tawal

Re : Renommer par lot à travers une arborescence

Hello
Pour un début (par un débutant) :

$ ls
$ touch file.txt.tmp
$ a=( $(ls *.txt.tmp) )
$ b=$(sed 's/\.tmp$//g' <<< $a)
$ echo $b
file.txt
$ ls
file.txt.tmp
$ mv $a $b
$ ls
file.txt
$

Le savoir n'a d’intérêt que si on le transmet.
Useless Use of Cat Award
Filenames and Pathnames in Shell: How to do it Correctly
À chaque problème sa solution, à chaque solution son moyen, si pas de moyen, toujours le problème !

Hors ligne

#3 Le 26/02/2021, à 17:15

Watael

Re : Renommer par lot à travers une arborescence

a=( $(ls *.txt.tmp) )

non.
pas ls ! jamais ls dans un script !!
et rarement une Substitution de commande dans une assignation de tableau.
et pas sed pour seulement enlever une extension.

et puis ça ne fonctionnera pas avec plusieurs fichiers. ça ferait mv 1.txt.tmp 2.txt.tmp 3.txt.tmp 1.txt
8O

KISS! :

for f in *.txt.tmp
do
    mv "$f" "${f%.*}"
done

ou alors, utiliser rename...

Dernière modification par Watael (Le 26/02/2021, à 17:16)


Connected \o/
Welcome to sHell. · eval is evil.

Hors ligne

#4 Le 26/02/2021, à 17:18

Tawal

Re : Renommer par lot à travers une arborescence

Hello,
Je m'attendais à ton intervention.
Je prends note de tes critiques wink
Merci

Edit: KISS is not smack but Keep It Simple and Stupid. Good sentence !

Dernière modification par Tawal (Le 26/02/2021, à 18:32)


Le savoir n'a d’intérêt que si on le transmet.
Useless Use of Cat Award
Filenames and Pathnames in Shell: How to do it Correctly
À chaque problème sa solution, à chaque solution son moyen, si pas de moyen, toujours le problème !

Hors ligne

#5 Le 26/02/2021, à 18:34

erresse

Re : Renommer par lot à travers une arborescence

NY152 a écrit :

une série de fichiers dans une arborescence

Et s'il y a des fichiers à traiter dans plusieurs niveaux imbriqués de l'arborescence (récursivité) ?


Plus de 50 ans d'informatique, ça en fait des lignes de commandes en console, mais on n'avait pas le choix...
Excellente raison pour, aujourd'hui qu'on le peut, utiliser au maximum les INTERFACES GRAPHIQUES !
Important : Une fois résolu, pensez à clore votre sujet en ajoutant [Résolu] devant le titre du 1er message, et un bref récapitulatif de la solution à la fin de celui-ci. Merci.

Hors ligne

#6 Le 26/02/2021, à 19:00

Watael

Re : Renommer par lot à travers une arborescence

tu as le choix
soit find ... -exec... (là, aussi, deux possibilités : \;, ou +)
soit find ... -print0 | while IFS='' read -rd '' nomFic...
soit shopt nullglob globstar; for f in ./**/*.txt.tmp; do ...
soit... rename(?)
...


Connected \o/
Welcome to sHell. · eval is evil.

Hors ligne

#7 Le 26/02/2021, à 21:49

NY152

Re : Renommer par lot à travers une arborescence

Je reviens ici et je vois plein de posts, merci de votre aide !

erresse a écrit :
NY152 a écrit :

une série de fichiers dans une arborescence

Et s'il y a des fichiers à traiter dans plusieurs niveaux imbriqués de l'arborescence (récursivité) ?

Oui y a plusieurs niveaux dans l'arborescence donc oui je dirai récursivité.

L'exemple de Watael ne suffirait pas ?

Hors ligne

#8 Le 26/02/2021, à 21:56

Watael

Re : Renommer par lot à travers une arborescence

la troisième proposition du post #6 à utiliser avec le mv du post #3.

est-ce qu'il peut déjà y avoir des fichiers .txt correspondant aux .tmp AVANT renommage ?


Connected \o/
Welcome to sHell. · eval is evil.

Hors ligne

#9 Le 26/02/2021, à 22:14

NY152

Re : Renommer par lot à travers une arborescence

Oula oula j'ai rien compris lol

Sinon il peut y avoir déjà des fichier .txt mais aucun .txt.tmp n'est sensé l'écraser, les noms sont uniques

Hors ligne

#10 Le 02/03/2021, à 23:27

Tawal

Re : Renommer par lot à travers une arborescence

Re,

Watael au #3 a écrit :

pas ls ! jamais ls dans un script !!

J'ai failli poser la question ici.
Mais j'ai fini par trouver la réponse, je pense, exacte : Why you shouldn't parse the output of ls
J'ai quelques de corrections à faire ...

Je cherche encore le pourquoi pas trop de substitution de commande dans une affectation de tableau.

Merci en tous cas de tes avertissements wink

Edit: Intéressant aussi : Filenames and Pathnames in Shell: How to do it Correctly

Dernière modification par Tawal (Le 02/03/2021, à 23:46)


Le savoir n'a d’intérêt que si on le transmet.
Useless Use of Cat Award
Filenames and Pathnames in Shell: How to do it Correctly
À chaque problème sa solution, à chaque solution son moyen, si pas de moyen, toujours le problème !

Hors ligne

#11 Le 02/03/2021, à 23:55

Watael

Re : Renommer par lot à travers une arborescence

Je cherche encore le pourquoi pas trop de substitution de commande dans une affectation de tableau.

parce que :

- soit tu ne mets pas de guillemets, et le tableau contiendra chaque mot de la sortie standard de la Substitution de commande dans autant d'éléments.

$ tablo=( $(echo "foo bar"; echo "baz") )
$ for i in "${!tablo[@]}"; do echo "élément n°$i : ${tablo[i]}"; done                                                                                                                                           
élément n°0 : foo                                                                                                                                                                                                                              
élément n°1 : bar                                                                                                                                                                                                                              
élément n°2 : baz

- soit tu mets des guillemets et le tableau ne contiendra qu'un seul élément avec tous les mots de la Substitution de commande.

$ tablo=( "$(echo "foo bar"; echo "baz")" ) 
$ for i in "${!tablo[@]}"; do echo "élément n°$i : ${tablo[i]}"; done
élément n°0 : foo bar
baz

Connected \o/
Welcome to sHell. · eval is evil.

Hors ligne

#12 Le 03/03/2021, à 00:15

Tawal

Re : Renommer par lot à travers une arborescence

Merci wink

sudo apt install shellcheck

va me servir je pense big_smile


Le savoir n'a d’intérêt que si on le transmet.
Useless Use of Cat Award
Filenames and Pathnames in Shell: How to do it Correctly
À chaque problème sa solution, à chaque solution son moyen, si pas de moyen, toujours le problème !

Hors ligne

#13 Le 03/03/2021, à 00:31

Watael

Re : Renommer par lot à travers une arborescence

je ne sais pas si ça relèvera ce type "d'erreur", parce que d'un point de vue syntaxique, c'est valide. hmm


Connected \o/
Welcome to sHell. · eval is evil.

Hors ligne

#14 Le 03/03/2021, à 00:48

Tawal

Re : Renommer par lot à travers une arborescence

$ cat test
#!/bin/bash

tablo1=( $(echo "foo bar"; echo "baz") )
for i in "${!tablo1[@]}"; do echo "élément n°$i : ${tablo1[i]}"; done

tablo2=( "$(echo "foo bar"; echo "baz")" ) 
for i in "${!tablo2[@]}"; do echo "élément n°$i : ${tablo2[i]}"; done


ls ./.* | wc -l    # un petit ls dans un script


$ shellcheck test

In test line 3:
tablo1=( $(echo "foo bar"; echo "baz") )
         ^-- SC2207: Prefer mapfile or read -a to split command output (or quote to avoid splitting).


In test line 10:
ls ./.* | wc -l    # un petit ls dans un script
^-- SC2012: Use find instead of ls to better handle non-alphanumeric filenames.

$

Edit Mise à jour avec les 2 tableaux, le 1er est reconnu en "erreur" wink

Dernière modification par Tawal (Le 03/03/2021, à 00:57)


Le savoir n'a d’intérêt que si on le transmet.
Useless Use of Cat Award
Filenames and Pathnames in Shell: How to do it Correctly
À chaque problème sa solution, à chaque solution son moyen, si pas de moyen, toujours le problème !

Hors ligne

#15 Le 03/03/2021, à 00:53

Watael

Re : Renommer par lot à travers une arborescence

mais la substitution dans le tableau est accepté. sad


Connected \o/
Welcome to sHell. · eval is evil.

Hors ligne

#16 Le 03/03/2021, à 00:59

Tawal

Re : Renommer par lot à travers une arborescence

Pas dans le 1er, j'ai mis à jour le post précédent wink


Le savoir n'a d’intérêt que si on le transmet.
Useless Use of Cat Award
Filenames and Pathnames in Shell: How to do it Correctly
À chaque problème sa solution, à chaque solution son moyen, si pas de moyen, toujours le problème !

Hors ligne

#17 Le 03/03/2021, à 01:29

Watael

Re : Renommer par lot à travers une arborescence

épatant.


Connected \o/
Welcome to sHell. · eval is evil.

Hors ligne

#18 Le 03/03/2021, à 08:29

Tawal

Re : Renommer par lot à travers une arborescence

épatant et tant mieux big_smile

Ça ne corrige pas les tanks pour des mouches.

Dernière modification par Tawal (Le 03/03/2021, à 08:30)


Le savoir n'a d’intérêt que si on le transmet.
Useless Use of Cat Award
Filenames and Pathnames in Shell: How to do it Correctly
À chaque problème sa solution, à chaque solution son moyen, si pas de moyen, toujours le problème !

Hors ligne