#1 Le 26/02/2021, à 14: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
.:NY152:.
Ma config de foufou ^^
Hors ligne
#2 Le 26/02/2021, à 15: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, à 16: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, à 16:16)
Connected \o/
Welcome to sHell. · eval is evil.
Hors ligne
#4 Le 26/02/2021, à 16:18
- Tawal
Re : Renommer par lot à travers une arborescence
Hello,
Je m'attendais à ton intervention.
Je prends note de tes critiques
Merci
Edit: KISS is not smack but Keep It Simple and Stupid. Good sentence !
Dernière modification par Tawal (Le 26/02/2021, à 17: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, à 17:34
- erresse
Re : Renommer par lot à travers une arborescence
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 le problème solutionné, 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, à 18: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, à 20:49
- NY152
Re : Renommer par lot à travers une arborescence
Je reviens ici et je vois plein de posts, merci de votre aide !
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 ?
.:NY152:.
Ma config de foufou ^^
Hors ligne
#8 Le 26/02/2021, à 20: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, à 21: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
.:NY152:.
Ma config de foufou ^^
Hors ligne
#10 Le 02/03/2021, à 22:27
- Tawal
Re : Renommer par lot à travers une arborescence
Re,
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
Edit: Intéressant aussi : Filenames and Pathnames in Shell: How to do it Correctly
Dernière modification par Tawal (Le 02/03/2021, à 22: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, à 22: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 02/03/2021, à 23:15
- Tawal
Re : Renommer par lot à travers une arborescence
Merci
sudo apt install shellcheck
va me servir je pense
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 02/03/2021, à 23: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.
Connected \o/
Welcome to sHell. · eval is evil.
Hors ligne
#14 Le 02/03/2021, à 23: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"
Dernière modification par Tawal (Le 02/03/2021, à 23: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 02/03/2021, à 23:53
- Watael
Re : Renommer par lot à travers une arborescence
mais la substitution dans le tableau est accepté.
Connected \o/
Welcome to sHell. · eval is evil.
Hors ligne
#16 Le 02/03/2021, à 23:59
- Tawal
Re : Renommer par lot à travers une arborescence
Pas dans le 1er, j'ai mis à jour le post précédent
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, à 00: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, à 07:29
- Tawal
Re : Renommer par lot à travers une arborescence
épatant et tant mieux
Ça ne corrige pas les tanks pour des mouches.
Dernière modification par Tawal (Le 03/03/2021, à 07: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