#1 Le 06/06/2008, à 19:20
- draco31.fr
[Résolu] Commande pour connaître le dev d'un fichier => df
Bonjour,
Je souhaiterai savoir si il existe une commande bash qui donnerait le device (ex /dev/hda) auquel appartient un fichier.
Cela pour ne pas lancer des copy/move concurentiels sur les mêmes disques durs en vue d'un script de backup multiples.
(Comme vous pouvez le comprendre, j'ai pas franchement envie d'aller fouiner dans le /etc/mtab à chaque fois)
Merci d'avance pour votre aide !
Dernière modification par draco31.fr (Le 07/06/2008, à 13:55)
Hors ligne
#2 Le 06/06/2008, à 19:53
- Totor
Re : [Résolu] Commande pour connaître le dev d'un fichier => df
à part "fuiner", je sais pas...
en tout cas, fuiner n'est pas bien compliqué mais ça ne serait pas suffisant si le couple path+fichier contient un dossier/fichier symbolique.
-- Lucid Lynx --
Hors ligne
#3 Le 06/06/2008, à 20:39
- UgM
Re : [Résolu] Commande pour connaître le dev d'un fichier => df
Bonsoir, je n'ai pas de solution complète! Juste une piste qui peut être utile :
sudo fdisk -l
Hors ligne
#4 Le 06/06/2008, à 21:16
- Totor
Re : [Résolu] Commande pour connaître le dev d'un fichier => df
Voilà un petit script qui te permettra d'avancer...
#!/bin/bash
suivreChemin()
{
element=$1
dirName=`dirname $1`
baseName=`basename $1`
if [ "${element}" != "/" ]; then
if test -L "${element}" ; then
link=`ls -ld ${element}|awk '{print $NF}'`
echo "`suivreChemin ${link}`"
else
if [ "${baseName}" == "." -o "${baseName}" == ".." ]; then
oldDir=`pwd`
cd ${element}
dirName=`pwd`
cd ${oldDir}
echo "`suivreChemin ${dirName}`"
else
# pour éviter les chemins relatifs
oldDir=`pwd`
cd ${dirName}
dirName=`pwd`
cd ${oldDir}
echo "`suivreChemin ${dirName}`/${baseName}"
fi
fi
fi
}
retrouveVraiChemin()
{
if test -e $1; then
if test -d $1 ; then
oldDir=`pwd`
cd $1
dirName=`pwd`
cd ${oldDir}
if [ "${dirName}" != "/" ] ; then
echo "`suivreChemin $1`"
else
echo "/"
fi
else
echo "`suivreChemin $1`"
fi
fi
}
quelDevice()
{
fichier=$1
vraiFichier=`retrouveVraiChemin ${fichier}`
for liste in `mount|awk '{ print $3";"$1}'|sort -r`; do
device=`echo ${liste}|cut -d\; -f2`
montage=`echo ${liste}|cut -d\; -f1 `
if [ "`echo ${vraiFichier}|grep ${montage}`" != "" ]; then
echo ${device}
break;
fi
done
}
#vraiChemin=`retrouveVraiChemin $1`
#if [ "${vraiChemin}" != "" ]; then
# echo "${vraiChemin}"
# exit 0
#else
# exit 1;
#fi
echo `quelDevice $1`
par contre, bizarrement, le mount|awk '{ print $3";"$1}'|sort -r, place /dev/pts;devpts après /;/dev/sda1
Dernière modification par Totor (Le 06/06/2008, à 22:06)
-- Lucid Lynx --
Hors ligne
#5 Le 07/06/2008, à 08:53
- draco31.fr
Re : [Résolu] Commande pour connaître le dev d'un fichier => df
Merci à tous pour vos idées.
@UgM
Le fdisk -l ne semble pas être une bonne solution car je ne peux pas relier les "device" à leur point de montage, c'est pour ça que je pensais me baser sur le fichier mtab ou fstab.
@ Totor
Dans un premier temps, je ne veux pas m'embêter avec les liens symboliques ...
Si j'ai un lien qui pointe vers un autre disque, et que je "sauvegarde" le lien, je ne veux pas qu'il me copie aussi le fichier cible du lien.
Ton script est très interressant, surtout pour moi qui débute totalement en programmation de script shell !
Par contre, je n'aurai vraiment pas pris cette option !
J'étais plus parti pour faire une série de "grep" pour toutes les lignes de mtab jusqu'à trouver un point de montage inclus dans le chemin du fichier/dossier.
C'est beaucoup pus bourrin que ton script récursif.
Par contre, je ne connais pas du tout awk donc je n'ai aucune idée de ce que fais ta commande... mais j'ai hâte de tester tout ça !
Encore merci.
PS : je comprends pas non plus l'utilité du retrouveVraiChemin()
NB : Je ne mets pas résolu au cas où quelqu'un connaîtrait LA commande ultime !
Hors ligne
#6 Le 07/06/2008, à 09:26
- Totor
Re : [Résolu] Commande pour connaître le dev d'un fichier => df
2 raisons au "pourquoi du retrouveVraiChemin()" ? :
- à cause des liens symboliques. D'ailleurs, pour moi , sauvegarder le lien sans sauvegarder le fichier cible n'a aucun intérêt ! (Que faire d'un lien qui pointe vers nul part ?)
- à cause de l'utilisation des chemins relatifs : comment peux-tu connaitre le device d'un dossier fourni au format "../../toto/titi " alors que les points de montage sont définit en absolu ?
awk : succintement et très sommairement, c'est un language permettant en autre de faire du traitement ligne à ligne
Dans mon cas, je l'utilise pour me fournir les information "device" et "point de montage" des points de montage. J'utilise la commande mount car il se peut, suivant l'option de montage, que des points de montage ne soit pas consigné dans le fichier mtab.
les informations sont fournies au format "pointdemontage;device", triées alphabétiquement inversé.
en effet,
si tu as les points de montage suivant :
/dev/hda1 qui est sur /mnt
/dev/hda2 qui est sur /mnt/toto
et que tu as le fichier /mnt/toto/dir1/dir2/fichier.txt
alors, si tu ne tries pas correctement, tu peux obtenir le device /dev/hda1 à la place de /dev/hda2
-- Lucid Lynx --
Hors ligne
#7 Le 07/06/2008, à 09:35
- bobo58
Re : [Résolu] Commande pour connaître le dev d'un fichier => df
salut ,
sinon tu peux utiliser la commande "df nomdefichier" pour recuperer le device.
#8 Le 07/06/2008, à 11:01
- Totor
Re : [Résolu] Commande pour connaître le dev d'un fichier => df
'tain c'est vrai , con que je suis !
plus exactement !
df nomFichier|tail -1|cut -d" " -f1
à défaut d'être utile, j'espère au moins que mon script t'auras appris qlq chose
-- Lucid Lynx --
Hors ligne
#9 Le 07/06/2008, à 13:24
- draco31.fr
Re : [Résolu] Commande pour connaître le dev d'un fichier => df
@ bobo58
Y a vraiment des fois ou on va chercher compliqué alors qu'on peut faire simple !
(je parle pour moi et surement pour Totor aussi )
@ Totor
Même si je ne me servirai peut-être pas de ton script tel que, il m'a fait comprendre que je n'avais pas fait le tour de mon problème (cas des chemins relatifs entre autre !)
Pour awk, j'en avais déjà entendu parlé (plus exactement, j'ai lu le man après avoir vu plusieurs appels à ce programme dans différents scripts !) mais je préfère d'abord me "concentrer" sur les commandes shell de "base" avant d'aborder ce "langage".
Pour ce qui est des liens symboliques, je pars du principe que je ne supprimme pas la source de ma copie, et si le lien pointe vers un fichier dans le même dossier ou sous-dossier à copier, il sera sauvegardé en même temps.
L'idée est de créer une "image" de sorte à pouvoir restaurer sur l'emplacement initial en cas de problème.
(mon besoin est assez spécifique, et pas "flexible" du tout, mais c'est surtout pour moi un "cas d'étude" qui ne me servira surement pas à long terme !!)
En bref, avec tout ça, j'ai de quoi me "faire la main" par des exercices pratiques !
Encore merci à tous !
Dernière modification par draco31.fr (Le 07/06/2008, à 13:26)
Hors ligne