# Test si une chaine de caractere est un fichier

**URL:** <https://www.debian-fr.org/t/test-si-une-chaine-de-caractere-est-un-fichier/35305>\
**Category:** Programmation\
**Created:** [Février 21, 2016, 3:58 UTC](https://www.debian-fr.org/t/test-si-une-chaine-de-caractere-est-un-fichier/35305 "2016-02-21T03:58:37Z")\
**Posts on this page:** 6\
**Page:** 1

<div class="post-metadata">

**Author:** ![croconux](https://www.debian-fr.org/letter_avatar_proxy/v4/letter/c/eada6e/32.png) [@croconux](https://www.debian-fr.org/u/croconux)\
**Post date:** [Février 21, 2016, 3:58 UTC](https://www.debian-fr.org/t/test-si-une-chaine-de-caractere-est-un-fichier/35305/1 "2016-02-21T03:58:37Z")

</div>

Bonjour  
en bash je sais que l’on utilise test

mais je ne vois pas quel fonction utiliser pour tester qu’une chaine de caractère est un nom de fichier valide sans creer un flux vers celui-ci

merci

---

<div class="post-metadata">

**Author:** ![panthere](https://www.debian-fr.org/letter_avatar_proxy/v4/letter/p/5daacb/32.png) [@panthere](https://www.debian-fr.org/u/panthere)\
**Post date:** [Février 21, 2016, 3:58 UTC](https://www.debian-fr.org/t/test-si-une-chaine-de-caractere-est-un-fichier/35305/2 "2016-02-21T03:58:42Z")

</div>

[quote=«&nbsp;croconux&nbsp;»]Bonjour  
en bash je sais que l’on utilise test

mais je ne vois pas quel fonction utiliser pour tester qu’une chaine de caractère est un nom de fichier valide sans creer un flux vers celui-ci

merci[/quote]  
salut  
man stat  
man ls  
 ![:114](https://www.debian-fr.org/uploads/default/original/1X/59912b0b680868015ba2afb82b3d05590e9739e4.gif "pere-noel")

---

<div class="post-metadata">

**Author:** ![MisterFreez](https://www.debian-fr.org/letter_avatar_proxy/v4/letter/m/bb73d2/32.png) [@MisterFreez](https://www.debian-fr.org/u/MisterFreez)\
**Post date:** [Février 21, 2016, 3:58 UTC](https://www.debian-fr.org/t/test-si-une-chaine-de-caractere-est-un-fichier/35305/3 "2016-02-21T03:58:46Z")

</div>

Je ne crois pas que ce soit ce qu’il cherche, il veut tester si une chaine est un chemin valide pas si les dossiers et/ou fichiers existent.

Pour cela il faut passer par une expression rationnelle mais je ne vois pas d’exemple de chemin invalide (dans les caractères affichables), donc je ne vois pas comment construire d’expression.

---

<div class="post-metadata">

**Author:** ![panthere](https://www.debian-fr.org/letter_avatar_proxy/v4/letter/p/5daacb/32.png) [@panthere](https://www.debian-fr.org/u/panthere)\
**Post date:** [Février 21, 2016, 3:58 UTC](https://www.debian-fr.org/t/test-si-une-chaine-de-caractere-est-un-fichier/35305/4 "2016-02-21T03:58:47Z")

</div>

Sa devrait être une norme, donc normalement il suffi de savoir ce qu’il est possible de cree comme nom de fichier et de répertoire. ensuite un filtre fait l’affaire.

---

<div class="post-metadata">

**Author:** ![josephtux](https://www.debian-fr.org/user_avatar/www.debian-fr.org/josephtux/32/3985_2.png) [@josephtux](https://www.debian-fr.org/u/josephtux)\
**Post date:** [Février 21, 2016, 4:01 UTC](https://www.debian-fr.org/t/test-si-une-chaine-de-caractere-est-un-fichier/35305/5 "2016-02-21T04:01:20Z")

</div>

[-f “la\_chaine”]  
ou  
test -f “la\_chaine”

pour les fichiers “normaux”

ou -a pour toute sorte de fichier ?

à moins que je n’ai pas compris la question ( cette histoire de flux … ? )

man bash, puis:  
/ -a fichier  
[size=85][/ ou la commande de recherche dans ton man][/size]  
te donnera la liste des tests sur les fichiers.

exemple: ces 3 syntaxes sont équivalente (ici)

```auto

```

```auto

```

```auto

```

Les tests peuvent se combiner:

`if [-f ${fichierps} -a ! -s ${fichierps}] ; then
  echo "Effacement du fichier vide ${fichierps}"
  ls -l ${fichierps}
  rm ${fichierps}
fi`

[ = debut de la commande test  
] = fin de le commande test  
-f = $fichier existe et c’est un fichier normal

-a = and

# Fichier vide:

! = négation du test suivant  
-s = existe et a une taille strictement positive

Attention: les espaces avant et après les crochets sont parties de la commande test: " [" et "] "

Pour un effacement silencieux:  
[-f ${fichierps} -a ! -s ${fichierps}] && rm ${fichierps}

---

<div class="post-metadata">

**Author:** ![branch](https://www.debian-fr.org/letter_avatar_proxy/v4/letter/b/ee7513/32.png) [@branch](https://www.debian-fr.org/u/branch)\
**Post date:** [Février 21, 2016, 4:06 UTC](https://www.debian-fr.org/t/test-si-une-chaine-de-caractere-est-un-fichier/35305/6 "2016-02-21T04:06:23Z")

</div>

[quote=“MisterFreez”]Je ne crois pas que ce soit ce qu’il cherche, il veut tester si une chaine est un chemin valide pas si les dossiers et/ou fichiers existent.

Pour cela il faut passer par une expression rationnelle mais je ne vois pas d’exemple de chemin invalide (dans les caractères affichables), donc je ne vois pas comment construire d’expression.[/quote]

Effectivement, on peut mettre n’importe quel caractère dans un nom de fichier (ou de répertoire) à l’exception du caractère slash / et du caractère nul (code ASCII : 0).

Or, croconux veut analyser un chemin, donc le caractère slash ne doit pas être rejeté. Donc il ne faut rejeter la chaîne que si elle contient le caractère nul :

[code]#on stocke un chemin à tester dans le fichier "chemin.txt"  
cat /dev/urandom | head -c 100 \> chemin.txt

#on teste si le chemin contient le caractère nul  
cat chemin.txt | od -tu1 -w1 -An | grep -qx ’ \*0 \*’

#on affiche le résultat du test  
if [$? -eq 0]; then  
echo le chemin n est pas valide  
else  
echo le chemin est valide  
fi[/code]
