Tester si un repertoire est sur le meme disque

Le
Remi Moyen
Salut,

Je cherche un moyen, dans un script shell, de tester si le contenu d'un
répértoire est situé sur le même volume physique que son parent, ou si
c'est au contraire un point de montage.

En clair, un truc qui me permette de faire :
$ mount
[]
/dev/hda5 on /usr type ext3 (rw)
$ cd /
$ mon_script
/etc est sur le même disque
/home est sur le même disque
[]
/usr n'est pas sur le même disque

Je n'ai rien vu dans les options de test(1), y'a que -d. Je pourrais bien
sûr faire une bidouille en allant lire /etc/mtab pour y trouver tous les
volumes actuellement montés, mais ça me semble bien compliqué, est-ce que
je ne serais pas en train de rater un truc plus simple ?

Merci !
--
Rémi Moyen
"Malgré les apparences, le temps est très varié à Nancy :
pluie, nuages, neige, brouillard, grêle, "
Vos réponses
Gagnez chaque mois un abonnement Premium avec GNT : Inscrivez-vous !
Trier par : date / pertinence
DINH Viêt Hoà
Le #453071

Je cherche un moyen, dans un script shell, de tester si le contenu d'un
répértoire est situé sur le même volume physique que son parent, ou si
c'est au contraire un point de montage.

En clair, un truc qui me permette de faire :
$ mount
[...]
/dev/hda5 on /usr type ext3 (rw)
$ cd /
$ mon_script
/etc est sur le même disque
/home est sur le même disque
[...]
/usr n'est pas sur le même disque


ls -i t'affiche le numéro d'inode.

ou "man stat" (1) puisque tu es sous linux.

--
DINH V. Hoa,

"s/^((\.|[^[]|[(^.|[^^])[^]]*])*)(\[^*[])/1\4/"
-- Stéphane CHAZELAS

Paul GABORIT
Le #452894
À (at) Tue, 20 Apr 2004 17:14:30 +0200,
Remi Moyen
Je cherche un moyen, dans un script shell, de tester si le contenu d'un
répértoire est situé sur le même volume physique que son parent, ou si
c'est au contraire un point de montage.
[...]

Je n'ai rien vu dans les options de test(1), y'a que -d. Je pourrais bien
sûr faire une bidouille en allant lire /etc/mtab pour y trouver tous les
volumes actuellement montés, mais ça me semble bien compliqué, est-ce que
je ne serais pas en train de rater un truc plus simple ?


Peut-être en comparant le résultat d'un 'df' sur le répertoire et sur son
parent (en ne s'intéressant qu'au point de montage car les valeurs
d'occupation peuvent changer)... mais ce n'est pas vraiment portable.

df / /usr
df / /etc


--
Paul Gaborit -
JustMe
Le #452893
DINH Viêt Hoà wrote:



Je cherche un moyen, dans un script shell, de tester si le contenu d'un
répértoire est situé sur le même volume physique que son parent, ou si
c'est au contraire un point de montage.

En clair, un truc qui me permette de faire :
$ mount
[...]
/dev/hda5 on /usr type ext3 (rw)
$ cd /
$ mon_script
/etc est sur le même disque
/home est sur le même disque
[...]
/usr n'est pas sur le même disque



ls -i t'affiche le numéro d'inode.

ou "man stat" (1) puisque tu es sous linux.



un bete :
df <nom du repertoire> | tail -1 | sed 's/ .*//'
te donnera le device qui contient le repertoire en question

donc ton script va donner :


#!/bin/sh

device()
{
df "$1" | tail -1 | sed 's/ .*//'
}

ROOTD=`device .`

for dir in *
do
if [ -d "$dir" ]
then
DEV=`device "$dir"`

if [ "$DEV" = "$ROOT" ]
then
echo "$dir est sur le meme disque"
else
echo "$dir n'est pas sur le meme disque"
fi
fi
done

pas exemple


Did0
Le #452892
Remi Moyen
Je cherche un moyen, dans un script shell, de tester si le contenu d'un
répértoire est situé sur le même volume physique que son parent, ou si
c'est au contraire un point de montage.

En clair, un truc qui me permette de faire :
$ mount
[...]
/dev/hda5 on /usr type ext3 (rw)
$ cd /
$ mon_script
/etc est sur le même disque
/home est sur le même disque
[...]
/usr n'est pas sur le même disque


Si tu as perl tu peux essayer :

perl -e 'foreach (<*>){if(-d){print "$_t".(((stat)[0]==(stat ".")[0])?'dir':'mnt')."n"}}'

--
Dido

Stephane Chazelas
Le #452889
2004-04-20, 17:14(+02), Remi Moyen:
Je cherche un moyen, dans un script shell, de tester si le contenu d'un
répértoire est situé sur le même volume physique que son parent, ou si
c'est au contraire un point de montage.


Tu peux connaitre le st_dev avec:

zsh -c 'zmodload zsh/stat; stat +dev /win'

Avec GNU stat:

stat -c %d


--
Stéphane ["Stephane.Chazelas" arobase "free.fr"]

DINH Viêt Hoà
Le #452701

Si tu as perl tu peux essayer :

perl -e 'foreach (<*>){if(-d){print "$_t".(((stat)[0]==(stat ".")[0])?'dir':'mnt')."n"}}'


merci de contribuer à la légende qui fait croire que perl
est illisible !

--
DINH V. Hoa,

"s/^((\.|[^[]|[(^.|[^^])[^]]*])*)(\[^*[])/1\4/"
-- Stéphane CHAZELAS

FAb
Le #452700
Stephane Chazelas
2004-04-20, 17:14(+02), Remi Moyen:
Je cherche un moyen, dans un script shell, de tester si le contenu d'un
répértoire est situé sur le même volume physique que son parent, ou si
c'est au contraire un point de montage.




Et en jouant avec find et les option xdev et maxdepth ?
Placer le script dans le parent et regarder si on trouve le fils


FAb
(début de piste)


JustMe
Le #452699
DINH Viêt Hoà wrote:



Si tu as perl tu peux essayer :

perl -e 'foreach (<*>){if(-d){print "$_t".(((stat)[0]==(stat ".")[0])?'dir':'mnt')."n"}}'



merci de contribuer à la légende qui fait croire que perl
est illisible !



pfff. ca vaut pas l'APL !


Remi Moyen
Le #452698
On Tue, 20 Apr 2004, Remi Moyen wrote:

Salut,

Je cherche un moyen, dans un script shell, de tester si le contenu d'un
répértoire est situé sur le même volume physique que son parent, ou si
c'est au contraire un point de montage.


Merci pour toutes vos réponses !

Je vais laisser tomber le truc perl, pas tant pour la complexité de la
commande, mais plus parce que d'une part je ne connais pas perl (et j'ai
pas envie de m'y mettre) et d'autre part il me semble relativement lourd
de lancer l'interpréteur perl pleins de fois là où des appels à des
commandes simples donne le même résultat.

Sinon, j'avais pas pensé à jouer avec df, et je ne connaissais pas stat,
mais j'ai tout ce qui me faut pour que je puisse bidouiller tout seul !
--
Rémi Moyen
"Malgré les apparences, le temps est très varié à Nancy :
pluie, nuages, neige, brouillard, grêle, ..."

Publicité
Poster une réponse
Anonyme