Test présence d'un répertoire
Je veux savoir si un répertoire existe ou si c'est un lien
Logiciels / Autres logiciels

zatox Membre non connecté
-
- Voir le profil du membre zatox
- Inscrit le : 27/09/2011
- Groupes :
Caché :
#! /bin/bash
if [ -d $DIR1 ]; then
if [ -L $DIR1 ]; then
echo "Le répertoire " $DIR1 " est un lien, on sort."
exit
fi
fi
if [ -d $DIR1 ]; then
if [ -L $DIR1 ]; then
echo "Le répertoire " $DIR1 " est un lien, on sort."
exit
fi
fi
Le problème est que quelque soit $DIR1 répertoire ou lien symbolique, on ne sort jamais.
Si $DIR1 est un lien symbolique vers un répertoire on ne sort pas.
Qu'est-ce que je fais mal ?

Édité par zatox Le 02/06/2022 à 18h55
Carte mère Gigabyte B650 AORUS ELITE AX V1.0 WiFi
Processeur AMD® 8 coeurs RYZEN 7 - 7700X (sans ventirad)
(2) Mémoire de 16 Go DDR5 @ 5600 MHz CL46 Crucial PRO
Carte video RX 7700 XT PULSE, SAPPHIRE®, 12 Go DDR6x
Disque SSD 2 To Gen.4 NVMe Samsung M.2 990 PRO
Carte réseau AMD® M.2 WI-FI 6E RZ616
Processeur AMD® 8 coeurs RYZEN 7 - 7700X (sans ventirad)
(2) Mémoire de 16 Go DDR5 @ 5600 MHz CL46 Crucial PRO
Carte video RX 7700 XT PULSE, SAPPHIRE®, 12 Go DDR6x
Disque SSD 2 To Gen.4 NVMe Samsung M.2 990 PRO
Carte réseau AMD® M.2 WI-FI 6E RZ616

OursoNoir Membre non connecté
-
- Voir le profil du membre OursoNoir
- Inscrit le : 14/02/2016
- Groupes :
Mettre une suite après "then" ? du genre
if [ -d $DIR1 ]; then exit
Ça me fait aussi penser à la commande "touch", mais pas sûr que ça t'avance beaucoup
Fiat Lux !

nic80 Membre non connecté
-
- Voir le profil du membre nic80
- Inscrit le : 06/08/2018
- Groupes :
-
Modérateur
Le fichier peut être de type répertoire et lien symbolique à la fois ? Je ne suis pas sur que ce soit possible. Or ici on regarde si le répertoire existe et ensuite on regarde si c' est un lien symbolique dans le même si.
Du coup si test voit que c' est un lien symbolique, la condition "if [ -d $DIR1 ]; then" est forcement fausse et on ne teste jamais le lien.
Une autre amélioration serait aussi de mettre $DIR1 en guillemets ( si par exemple la cible contient des espaces dans le nom "$DIR1").

zatox Membre non connecté
-
- Voir le profil du membre zatox
- Inscrit le : 27/09/2011
- Groupes :
J'ai modifié mon test, voici ce que j'ai fait:
Caché :
if [ -L $DIR1 ]; then
echo "Le répertoire " $DIR1 " est un lien, on sort."
exit
fi
ou comme ça c'est pareil:
if [ -L "$DIR1" ]; then
echo "Le répertoire " $DIR1 " est un lien, on sort."
exit
fi
echo "Le répertoire " $DIR1 " est un lien, on sort."
exit
fi
ou comme ça c'est pareil:
if [ -L "$DIR1" ]; then
echo "Le répertoire " $DIR1 " est un lien, on sort."
exit
fi
Si j'en crois le man test, il dit ceci:
Caché :
-L FICHIER
FICHIER existe, c'est un lien symbolique (identique à -h)
FICHIER existe, c'est un lien symbolique (identique à -h)
Normalement le -L teste s'il s'agit d'un lien ou non enfin je pense.
Le problème est qu'il s'agisse d'un dossier ou d'un lien vers un dossier, il ne passe jamais dans le test, il fait toujours la même chose.
J'ai ceci:


On voit bien ici que Documents est un dossier et pour Test il pointe bien vers un dossier donc c'est un lien mais j'ai l'impression qu'il le considère comme un dossier !!!!!
En tous cas au niveau du test que je fais avec -L dans les 2 cas il réagit de la même façon et considère que Documents et Test sont 2 dossiers alors que Test est un lien vers un dossier !!!!!! moi pas bien comprendre ...
Remarque: le man test parle de fichiers et pas de dossiers, cela aurait-il une importance au niveau des liens ?!!
Pour ma part il s'agit d'un lien vers un dossier ...
Merci pour votre aide.
Édité par zatox Le 04/06/2022 à 11h11
Carte mère Gigabyte B650 AORUS ELITE AX V1.0 WiFi
Processeur AMD® 8 coeurs RYZEN 7 - 7700X (sans ventirad)
(2) Mémoire de 16 Go DDR5 @ 5600 MHz CL46 Crucial PRO
Carte video RX 7700 XT PULSE, SAPPHIRE®, 12 Go DDR6x
Disque SSD 2 To Gen.4 NVMe Samsung M.2 990 PRO
Carte réseau AMD® M.2 WI-FI 6E RZ616
Processeur AMD® 8 coeurs RYZEN 7 - 7700X (sans ventirad)
(2) Mémoire de 16 Go DDR5 @ 5600 MHz CL46 Crucial PRO
Carte video RX 7700 XT PULSE, SAPPHIRE®, 12 Go DDR6x
Disque SSD 2 To Gen.4 NVMe Samsung M.2 990 PRO
Carte réseau AMD® M.2 WI-FI 6E RZ616

nic80 Membre non connecté
-
- Voir le profil du membre nic80
- Inscrit le : 06/08/2018
- Groupes :
-
Modérateur
Je pense que c' est du au fait que de cette mention dans le man:
man test :
Excepté -h et -L, tous les tests opérant sur des fichiers déréférencent les liens symboliques.
D' après wikipedia:
"On appelle déréférencement l'action du système d'exploitation consistant à remplacer à la volée le nom du lien symbolique par celui qu'il pointe. "
Ici en conséquence, quand on test si c' est un répertoire, l' OS vérifie la cible du lien automatiquement, Et donc la condition "est un répertoire" est donc vraie.
Si on doit sortir du script si c 'est un lien symbolique, je pense qu' il faut tester d' abord le lien symbolique, puis si c' est un répertoire ( donc inverser les tests
Citation :
Remarque: le man test parle de fichiers et pas de dossiers, cela aurait-il une importance au niveau des liens ?!!
un répertoire est un fichier spécial tout comme un lien symbolique il me semble.
Dans l' affichage, je suppose que le déférencement est fait automatiquement pour afficher que c' est un dossier ( et utilise la fonction readlink pour obtenir le chemin réel).
edit: avec readlink qu' est ce que cela donne ?
Code BASH :
#!/bin/bash # on teste si DIR1 existe if [ -e "$DIR1" ]; then #echo "Teste si $DIR1 est un lien symbolique au travers de readlink. La valeur de retour devrait être 0 si c' est le cas, autre chose sinon" readlink "$DIR1" > /dev/null if [ $? -eq 0 ]; then echo "$DIR1 est un lien symbolique vers $(readlink "$DIR1"), on quitte le script" exit 0 else echo "$DIR1 est d' un autre type. Est ce un répertoire ?" if [ -d "$DIR1" ]; then echo " $DIR1 est un répertoire, on peut faire les traitements relatifs aux répertoires." else echo "$DIR1 n'est ni un lien symbolique, ni un répertoire. On quitte avec le code 3." exit 3 fi fi else echo "$DIR1 n' existe pas. On quitte avec le code 1" exit 1 fi
Édité par nic80 Le 04/06/2022 à 13h13

zatox Membre non connecté
-
- Voir le profil du membre zatox
- Inscrit le : 27/09/2011
- Groupes :
Cependant ça ne marche pas non plus.J'ai fait un copier/coller du code que tu m'as donné, voici les résultats:
Premièrement pour le dossier Documents
Deuxièmement pour le lien Test:
Caché :
[root@localhost zzz_sauvegardes]# ./3_save_doc_allinone_vers_maxtor00.sh
/home/robert/Documents/ est d' un autre type. Est ce un répertoire ?
/home/robert/Documents/ est un répertoire, on peut faire les traitements relatifs aux répertoires.
/home/robert/Documents/ est d' un autre type. Est ce un répertoire ?
/home/robert/Documents/ est un répertoire, on peut faire les traitements relatifs aux répertoires.
Caché :
[root@localhost zzz_sauvegardes]# ./3_save_tes_allinone_vers_maxtor00.sh
/home/robert/Test/ est d' un autre type. Est ce un répertoire ?
/home/robert/Test/ est un répertoire, on peut faire les traitements relatifs aux répertoires.
/home/robert/Test/ est d' un autre type. Est ce un répertoire ?
/home/robert/Test/ est un répertoire, on peut faire les traitements relatifs aux répertoires.
Donc il considère Test comme un répertoire et pas comme un lien ce qui est bien mon problème depuis le début.
Je dois m'absenter, je regarderai ton code de plus près ultérieurement mais je crains de ne pas être capable de faire mieux que toi.

Carte mère Gigabyte B650 AORUS ELITE AX V1.0 WiFi
Processeur AMD® 8 coeurs RYZEN 7 - 7700X (sans ventirad)
(2) Mémoire de 16 Go DDR5 @ 5600 MHz CL46 Crucial PRO
Carte video RX 7700 XT PULSE, SAPPHIRE®, 12 Go DDR6x
Disque SSD 2 To Gen.4 NVMe Samsung M.2 990 PRO
Carte réseau AMD® M.2 WI-FI 6E RZ616
Processeur AMD® 8 coeurs RYZEN 7 - 7700X (sans ventirad)
(2) Mémoire de 16 Go DDR5 @ 5600 MHz CL46 Crucial PRO
Carte video RX 7700 XT PULSE, SAPPHIRE®, 12 Go DDR6x
Disque SSD 2 To Gen.4 NVMe Samsung M.2 990 PRO
Carte réseau AMD® M.2 WI-FI 6E RZ616

Jybz Membre non connecté
-
- Voir le profil du membre Jybz
- Inscrit le : 10/10/2018
- Groupes :
-
Administrateur
-
Forgeron
${dir1}
Comme Nic80 l'a mentionné, il faut utiliser les guillemets pour opérer sur des fichiers au cas où il y a des espaces, tabulations, retours à la lignes. (Alternative, il faut modifier la variable IFS).
Téléverser une image : /wiki/hebergement-de-fichiers-sur-mlo
Arch | Machine | OS |
x86_64 | lenovo x250 | mga9 |
armv7hl | bananapro | mga9 |
aarch64 | Raspberry Pi 4B | mga9 |

Jybz Membre non connecté
-
- Voir le profil du membre Jybz
- Inscrit le : 10/10/2018
- Groupes :
-
Administrateur
-
Forgeron
Code BASH :
if [[ -h /lib ]] ; then echo "c'est un lien symbolique." ; fi c'est un lien symbolique.
Téléverser une image : /wiki/hebergement-de-fichiers-sur-mlo
Arch | Machine | OS |
x86_64 | lenovo x250 | mga9 |
armv7hl | bananapro | mga9 |
aarch64 | Raspberry Pi 4B | mga9 |

Jybz Membre non connecté
-
- Voir le profil du membre Jybz
- Inscrit le : 10/10/2018
- Groupes :
-
Administrateur
-
Forgeron
Code BASH :
for dir1 in $(dir) ; do if [[ -h "${dir1}" ]] ; then echo "${dir1} est symlink" ; else echo "${dir1} est autre" ; fi; done bin est symlink dev est autre home est autre lib est symlink media est autre opt est autre root est autre sbin est symlink sys est autre usr est autre boot est autre etc est autre initrd est autre lost+found est autre mnt est autre proc est autre run est autre srv est autre tmp est autre var est autre
Téléverser une image : /wiki/hebergement-de-fichiers-sur-mlo
Arch | Machine | OS |
x86_64 | lenovo x250 | mga9 |
armv7hl | bananapro | mga9 |
aarch64 | Raspberry Pi 4B | mga9 |

zatox Membre non connecté
-
- Voir le profil du membre zatox
- Inscrit le : 27/09/2011
- Groupes :
Jybz merci pour ton aide.
Voici ce que j'ai fait:
Caché :
cd /home/robert/
for dir1 in $(dir) ;
do
if [[ -h "${dir1}" ]] ;
then
echo "${dir1} est symlink" ;
else
echo "${dir1} est autre" ;
fi;
done
cd /home/robert/
for dir1 in $(dir) ;
do
if [[ -h "${dir1}" ]] ;
then
echo "${dir1} est symlink" ;
else
echo "${dir1} est autre" ;
fi;
done
donne le résultat (que j'ai abrégé) suivant:
Caché :
Téléchargement est autre
Bureau est autre
Test est symlink
Téléchargement est autre
Bureau est autre
Test est symlink
On voit donc très bien que Test est symlink
Téléchargement et Bureau sont autre là ça me convient c'est ce que je voulais et qui correspond à la réalité.
Ensuite j''ai écrit ceci:
Caché :
:echo "DIR1 = " $DIR1
if [[ -h "${DIR1}" ]] ;
then
echo "${DIR1} est symlink" ;
else
echo "${DIR1} est autre" ;
fi;
if [[ -h "${DIR1}" ]] ;
then
echo "${DIR1} est symlink" ;
else
echo "${DIR1} est autre" ;
fi;
le résultat est:
Caché :
DIR1 = /home/robert/Test/
/home/robert/Test/ est autre
/home/robert/Test/ est autre
Là les bras m'en tombent !!!!!!!!!!!
Alors j'ai écrit ceci:
Caché :
echo "Dossier traité = " $DOSSIER_TRAITE
if [[ -h "${DOSSIER_TRAITE}" ]] ;
then
echo "${DOSSIER_TRAITE} est symlink" ;
else
echo "${DOSSIER_TRAITE} est autre" ;
fi;
if [[ -h "${DOSSIER_TRAITE}" ]] ;
then
echo "${DOSSIER_TRAITE} est symlink" ;
else
echo "${DOSSIER_TRAITE} est autre" ;
fi;
le résultat est:
Caché :
Dossier traité = Test
Test est symlink
Test est symlink
J'en conclus que:
/home/robert/Test est autre mais que
Test dans /home/robert/ est symlink !!!!!!!!!!!!
Bon c'est donc cette dernière syntaxe que je vais utiliser, qui me permet de déterminer si j'ai un lien ou pas.
Néanmoins c'est un peu bizarre de dire
/home/robert/Test/ est autre mais Test dans /home/robert/ est symlink non ?!!!
Qu'en pensez-vous ?
Ceci dit

Édité par zatox Le 05/06/2022 à 14h48
Carte mère Gigabyte B650 AORUS ELITE AX V1.0 WiFi
Processeur AMD® 8 coeurs RYZEN 7 - 7700X (sans ventirad)
(2) Mémoire de 16 Go DDR5 @ 5600 MHz CL46 Crucial PRO
Carte video RX 7700 XT PULSE, SAPPHIRE®, 12 Go DDR6x
Disque SSD 2 To Gen.4 NVMe Samsung M.2 990 PRO
Carte réseau AMD® M.2 WI-FI 6E RZ616
Processeur AMD® 8 coeurs RYZEN 7 - 7700X (sans ventirad)
(2) Mémoire de 16 Go DDR5 @ 5600 MHz CL46 Crucial PRO
Carte video RX 7700 XT PULSE, SAPPHIRE®, 12 Go DDR6x
Disque SSD 2 To Gen.4 NVMe Samsung M.2 990 PRO
Carte réseau AMD® M.2 WI-FI 6E RZ616

Jybz Membre non connecté
-
- Voir le profil du membre Jybz
- Inscrit le : 10/10/2018
- Groupes :
-
Administrateur
-
Forgeron
Je peux dire, si le dossier n'est pas trouvé, alors il dira que c'est autre.
Le mieux, c'est de tester l'existance avant.
Code BASH :
fichier="${HOME}/Test" if [[ -e "${fichier}" ]] ; then if [[ -h "${fichier}" ]] ; then echo "Le ${fichier} est un sym-link." else if [[ -d "${fichier}" ]] ; then echo "Le ${fichier} est un dossier." else echo "Le ${fichier} n'est pas un dossier. Un fifo, block, char, au autre fichier peut-être..." fi fi else echo "Fichier '${fichier}' non trouvé." fi
Téléverser une image : /wiki/hebergement-de-fichiers-sur-mlo
Arch | Machine | OS |
x86_64 | lenovo x250 | mga9 |
armv7hl | bananapro | mga9 |
aarch64 | Raspberry Pi 4B | mga9 |

nic80 Membre non connecté
-
- Voir le profil du membre nic80
- Inscrit le : 06/08/2018
- Groupes :
-
Modérateur
Dans le cadre d' un lien symbolique que se passe t' il si le lien est cassé ?
Le fichier existe t' il ou pas ( puisque le lien est déférencé par la commande test ( quel est l' intérêt de mettre deux fois le crochet ?) ?
Citation :
/home/robert/Test/ est autre mais Test dans /home/robert/ est symlink non ?!!!
Je pense que le fait de rajouter le / à la fin indique explicitement que c' est un répertoire ( donc autre).
edit:
Code BASH :
[x@localhost ~ ]$ls -al rep* lrwxrwxrwx 1 x x 16 juin 4 09:05 rep_test -> repertoire_test/ repertoire_test: total 16 drwxr-xr-x 2 x x 4096 juin 5 18:45 . drwxr-xr-x 121 x x 12288 juin 5 18:45 .. [x@localhost ~ ]$ [x@localhost ~ ]$file rep_test rep_test: symbolic link to repertoire_test/ [x@localhost ~ ]$file rep_test/ rep_test/: directory [x@localhost ~ ]$ls -al rep* lrwxrwxrwx 1 x x 16 juin 4 09:05 rep_test -> repertoire_test/ repertoire_test: total 16 drwxr-xr-x 2 x x 4096 juin 5 18:45 . drwxr-xr-x 121 x x 12288 juin 5 18:45 .. [x@localhost ~ ]$rm repertoire_test/ rm: impossible de supprimer 'repertoire_test/': est un dossier [x@localhost ~ ]$[ -e rep_test ] [x@localhost ~ ]$echo $? 0 [x@localhost ~ ]$rm -f -r repertoire_test/ [x@localhost ~ ]$[ -e rep_test ] [x@localhost ~ ]$echo $? 1 [x@localhost ~ ]$ls -al rep* lrwxrwxrwx 1 x x 16 juin 4 09:05 rep_test -> repertoire_test/ [x@localhost ~ ]$
Édité par nic80 Le 05/06/2022 à 20h35

zatox Membre non connecté
-
- Voir le profil du membre zatox
- Inscrit le : 27/09/2011
- Groupes :

Carte mère Gigabyte B650 AORUS ELITE AX V1.0 WiFi
Processeur AMD® 8 coeurs RYZEN 7 - 7700X (sans ventirad)
(2) Mémoire de 16 Go DDR5 @ 5600 MHz CL46 Crucial PRO
Carte video RX 7700 XT PULSE, SAPPHIRE®, 12 Go DDR6x
Disque SSD 2 To Gen.4 NVMe Samsung M.2 990 PRO
Carte réseau AMD® M.2 WI-FI 6E RZ616
Processeur AMD® 8 coeurs RYZEN 7 - 7700X (sans ventirad)
(2) Mémoire de 16 Go DDR5 @ 5600 MHz CL46 Crucial PRO
Carte video RX 7700 XT PULSE, SAPPHIRE®, 12 Go DDR6x
Disque SSD 2 To Gen.4 NVMe Samsung M.2 990 PRO
Carte réseau AMD® M.2 WI-FI 6E RZ616
Répondre
Vous n'êtes pas autorisé à écrire dans cette catégorie