logo Debian Debian Debian-France Debian-Facile Debian-fr.org Forum-Debian.fr Debian ? Communautés logo inclusivité

Debian-facile

Bienvenue sur Debian-Facile, site d'aide pour les nouveaux utilisateurs de Debian.

Vous n'êtes pas identifié(e).

#1 06-04-2014 08:19:39

Hypathie
Membre
Lieu : Chambéry _ Montréal
Distrib. : Jessie
Noyau : Linux debian 3.16.0-4-586
(G)UI : Cinnamon Mate Xfce
Inscription : 28-12-2013

Tableaux bash et équivalents POSIX

Bonjour, j'ai un problème vraiment tordu. big_smile

Pour le présenter, voilà deux scripts (discution d'hier) qui renomment les fichiers d'un répertoire.

La première méthode utilise un tableau, j'ai tendu autant que possible à le rende POSIX mais on dirait qu'un tableau ne l'est jamais complètement :


#!/bin/bash
set +eu
#mkdir ~/DirTest2  #pour faire des essais
cd ~/DirTest2/
#touch Juillet Aout Septembre Octobre Novembre Decembre #pour faire des essais
fichiers=( $(ls) )
echo ${fichiers[@]}

# parcourir tous les paramètres du tableau avec une boucle

for i in "${fichiers[@]}"
do
   echo "$i"
# changer les paramètres du tableau (=noms des fichiers)
#  mv "$i" "$(echo $i | sed 's/.\+/&.txt/')"  # pour essayer exp. ratio.
mv "$i" "$i.txt"  
echo "$i.txt" #( alors pas besoin de ls en bas)
done
#ls ~/DirTest2
 



Impossible de se passer du cd avec un tableau, en faisant :


fichiers=( $(ls /home/hypathie/DirTest2) )
 



sans faire échouer la ligne du mv "$i" "$i.txt"   sad   Que des désavantages ? ....

Est-ce inutile d'apprendre les tableaux en bash ?

D'ailleurs, c'est la création des fichiers qui range par ordre alphabétique, et fait perdre l'ordre d'inscription


touch Juillet Aout Septembre Octobre Novembre Decembre
 




Si par exemple, on veut que dans le dossier DirTest2, l'ordre "Juillet Aout Septembre Octobre Novembre Decembre" soit conservé, est-ce que faire passer la boucle dans un tableau en se servant de l'ordre d'indexation des cases (j'espérais trouver  avec un truc du genre :


tableau=(un deux trois quatre cinq)
$ echo ${tableau[@]}

((deb=$#{tableau[@]}, fin=deb - 1))
for (( i = 0; i <=fin; i++)) ; do
...
done
 


sad 

en espérant que se soit un moyen de forcer le rangement que l'on veut  dans le répertoire au moment où on les renomme?

La méthode de captnfab POSIX,

entraîne tout autant un rangement par ordre alphabétique des fichiers dans le répertoire, ce n'était pas le but rechercher smile


#!/bin/sh
set +eu
D="/home/hypathie/DirTest/"

for i in "$D/"*
do
   F=$(basename "$i")
   echo "Déplacement de $F dans $D en $F.txt"
   mv "$i" "$i.txt"
done
 



mais peut-elle réaliser ce but ?

Pour simplifier est-ce qu'on a développé en bash les tableaux parce qu'ils pourraient permettre par exemple un rangement contrôlés, tandis que le faire avec une variable quelconque c'est impossible ou très très compliqué ?

Sinon, quel l'intérêt aux tableaux qui ne sont pas posix ?
Je cherche quel est leur intérêt après avoir lu cela http://wiki.bash-hackers.org/syntax/arr … iderations  sad

Merci

Dernière modification par Hypathie (06-04-2014 08:21:05)

Hors ligne

#2 06-04-2014 10:34:50

captnfab
Admin-Girafe
Lieu : /dev/random
Distrib. : Debian
Noyau : Dur
(G)UI : gui gui, je zuis un doiseau
Inscription : 07-07-2008
Site Web

Re : Tableaux bash et équivalents POSIX

Hypathie a écrit :

Est-ce inutile d'apprendre les tableaux en bash ?


De mon point de vue, oui, très largement smile

Hypathie a écrit :

D'ailleurs, c'est la création des fichiers qui range par ordre alphabétique, et fait perdre l'ordre d'inscription


touch Juillet Aout Septembre Octobre Novembre Decembre
 


Est-tu sûre que quand tu donnes plusieurs arguments à touch il crée les fichiers dans l'ordre des arguments donnés ?

Hypathie a écrit :

Si par exemple, on veut que dans le dossier DirTest2, l'ordre "Juillet Aout Septembre Octobre Novembre Decembre" soit conservé…


Il n'y a pas vraiment d'ordre des fichiers dans un dossier.
Tu peux lister les fichiers par ordre alphabétique, par ordre de création, par ordre de dernière modification, de dernier accès, mais c'est tout.

Renommage puis listing par ordre de création :

#!/bin/sh
set +eu
D="/home/hypathie/DirTest/"

for i in "$D/"*
do
   F=$(basename "$i")
   echo "Déplacement de $F dans $D en $F.txt"
   mv "$i" "$i.txt"
done

/bin/ls -c -1 "$D"
 



Cela-dit, trier par ordre de création, ça me semble dangereux… Pour des classements par date, je te conseille des noms de dossier du genre « 2014-04 », de manière à ce que l'ordre alphabétique coïncide.


captnfab,
Association Debian-Facile, bépo.
TheDoctor: Your wish is my command… But be careful what you wish for.

Hors ligne

#3 06-04-2014 10:54:00

captnfab
Admin-Girafe
Lieu : /dev/random
Distrib. : Debian
Noyau : Dur
(G)UI : gui gui, je zuis un doiseau
Inscription : 07-07-2008
Site Web

Re : Tableaux bash et équivalents POSIX

Quelques précisions :

Physiquement, un dossier n'est qu'une liste de noms de fichiers et d'inodes, l'ordre n'a pas vraiment de sens et est propre au système de fichier.
Quant aux dates de création/modification/accès, elles sont stockées dans les inodes des fichiers, mais propres au système de fichier.

Autrement dit, tu risques de perdre ton ordre si tu copies tes fichiers sur une autre partition, une clé usb, ou après un fsck ou n'importe quelle opération de maintenance / archivage.

Donc, mauvaise idée AMHA smile

captnfab,
Association Debian-Facile, bépo.
TheDoctor: Your wish is my command… But be careful what you wish for.

Hors ligne

#4 06-04-2014 12:04:59

Hypathie
Membre
Lieu : Chambéry _ Montréal
Distrib. : Jessie
Noyau : Linux debian 3.16.0-4-586
(G)UI : Cinnamon Mate Xfce
Inscription : 28-12-2013

Re : Tableaux bash et équivalents POSIX

Mais existe-t-il des fichiers de type dossier exécutable qui contiennent des fichiers exécutables aussi, et dont l'ordre de rangement permet l'exécution du fichier de type dossier.
big_smile

Hors ligne

#5 06-04-2014 12:27:05

captnfab
Admin-Girafe
Lieu : /dev/random
Distrib. : Debian
Noyau : Dur
(G)UI : gui gui, je zuis un doiseau
Inscription : 07-07-2008
Site Web

Re : Tableaux bash et équivalents POSIX

Les droits d'exécution sur un dossier correspondent uniquement au fait de pouvoir « traverser » celui-ci.
I.E. :

ls /tmp/dossier/bla


te renverra une erreur si tu n'as pas les droits d'exécution sur «dossier». On ne «lance» pas un dossier.

De même,

ls /tmp/dossier


te renverra une erreur si tu n'as pas les droits de lecture sur «dossier».


captnfab,
Association Debian-Facile, bépo.
TheDoctor: Your wish is my command… But be careful what you wish for.

Hors ligne

Pied de page des forums