# \[Bash\] bouger un fichier s'il existe

**URL:** <https://www.debian-fr.org/t/bash-bouger-un-fichier-sil-existe/28457>\
**Category:** Programmation\
**Created:** [Février 20, 2016, 11:20 UTC](https://www.debian-fr.org/t/bash-bouger-un-fichier-sil-existe/28457 "2016-02-20T23:20:25Z")\
**Posts on this page:** 7\
**Page:** 1

<div class="post-metadata">

**Author:** ![Glorf](https://www.debian-fr.org/letter_avatar_proxy/v4/letter/g/d6d6ee/32.png) [@Glorf](https://www.debian-fr.org/u/Glorf)\
**Post date:** [Février 20, 2016, 11:20 UTC](https://www.debian-fr.org/t/bash-bouger-un-fichier-sil-existe/28457/1 "2016-02-20T23:20:25Z")

</div>

Bonjour,  
j’ai un léger problème : je parcoure un tableau contenant une liste d’extension, et pour chaque extension, je bouge tous les fichiers contenant ce nom dans un certain répertoire.  
Seulement, si aucun n’a l’extension que je traite, il m’affiche un message d’erreur "mv: impossible d’évaluer « \*.jpg »: Aucun fichier ou dossier de ce type"  
le script tourne, mais c’est pas très agréable …

`
extension_image=('jpg' 'png' 'gif' 'bmp' 'svg')
for extension in "${extension_image[@]}"
do
	mv *.$extension $dossier_image
done`  
Comment faire ? j’ai essayé de faire if [-f “\*.$extension”], mais ça ne marche pas …  
Glorf

---

<div class="post-metadata">

**Author:** ![ggoodluck47](https://www.debian-fr.org/letter_avatar_proxy/v4/letter/g/c67d28/32.png) [@ggoodluck47](https://www.debian-fr.org/u/ggoodluck47)\
**Post date:** [Février 20, 2016, 11:20 UTC](https://www.debian-fr.org/t/bash-bouger-un-fichier-sil-existe/28457/2 "2016-02-20T23:20:25Z")

</div>

Salut,

Envoyer les messages d’erreurs vers \> /dev/null 🙂

---

<div class="post-metadata">

**Author:** ![Totor](https://www.debian-fr.org/letter_avatar_proxy/v4/letter/t/58f4c7/32.png) [@Totor](https://www.debian-fr.org/u/Totor)\
**Post date:** [Février 20, 2016, 11:20 UTC](https://www.debian-fr.org/t/bash-bouger-un-fichier-sil-existe/28457/3 "2016-02-20T23:20:27Z")

</div>

Re,

```auto
shopt -q nullglob && shopt -s nullglob || nullglob=-u

extension_image=('jpg' 'png' 'gif' 'bmp' 'svg')
for extension in "${extension_image[@]}"
do
   fichiers=( *.${extension} )
   (( ${#fichiers[@]} > 0 )) && mv "${fichiers[@]}" "${dossier_image}"
done
[${nullglob}] && shopt ${nullglob} nullglob
```

---

<div class="post-metadata">

**Author:** ![Glorf](https://www.debian-fr.org/letter_avatar_proxy/v4/letter/g/d6d6ee/32.png) [@Glorf](https://www.debian-fr.org/u/Glorf)\
**Post date:** [Février 20, 2016, 11:20 UTC](https://www.debian-fr.org/t/bash-bouger-un-fichier-sil-existe/28457/4 "2016-02-20T23:20:28Z")

</div>

Un petit 2 \> /dev/null et c’est réglé, merci !

---

<div class="post-metadata">

**Author:** ![Totor](https://www.debian-fr.org/letter_avatar_proxy/v4/letter/t/58f4c7/32.png) [@Totor](https://www.debian-fr.org/u/Totor)\
**Post date:** [Février 20, 2016, 11:20 UTC](https://www.debian-fr.org/t/bash-bouger-un-fichier-sil-existe/28457/5 "2016-02-20T23:20:28Z")

</div>

non, ce n’est pas propre : si l’instruction mv génère une erreur, tu ne comprendras pas pourquoi tes fichiers n’ont pas été déplacé.

---

<div class="post-metadata">

**Author:** ![Glorf](https://www.debian-fr.org/letter_avatar_proxy/v4/letter/g/d6d6ee/32.png) [@Glorf](https://www.debian-fr.org/u/Glorf)\
**Post date:** [Février 20, 2016, 11:20 UTC](https://www.debian-fr.org/t/bash-bouger-un-fichier-sil-existe/28457/6 "2016-02-20T23:20:28Z")

</div>

` fichiers=( *.${extension} )
   (( ${#fichiers[@]} > 0 )) && mv "${fichiers[@]}" "${dossier_image}"`  
là on récupère dans fichiers la liste des fichiers avec l’extension, et on bouge si le tableau contient au moins une valeur ?  
Mais c’est quoi comme syntaxe ?  
et que fait ce code :

`shopt -q nullglob && shopt -s nullglob || nullglob=-u
[${nullglob}] && shopt ${nullglob} nullglob
`

---

<div class="post-metadata">

**Author:** ![Totor](https://www.debian-fr.org/letter_avatar_proxy/v4/letter/t/58f4c7/32.png) [@Totor](https://www.debian-fr.org/u/Totor)\
**Post date:** [Février 20, 2016, 11:20 UTC](https://www.debian-fr.org/t/bash-bouger-un-fichier-sil-existe/28457/7 "2016-02-20T23:20:28Z")

</div>

Tout d’abord, j’ai été un peu vite : ceci shopt -q nullglob && shopt -s nullglob || nullglob=-u est erroné et est à remplacer par shopt -q nullglob || { shopt -s nullglob; nullglob=-u ; }

qui signifie :  
si l’option bash nullglob n’est pas activée alors on l’active et on affecte la valeur “-u” à la variable nullglob. la négation s’effectuant grace à || qui exécute l’instuction qui suit si l’instruction précédente a échouée.

l’option nullglob permet de dire à bash s’il doit retourner null si aucun fichiers ne correspond au pattern fourni.

pour [${nullglob}] && shopt ${nullglob} nullglob cela signifie :  
si la variable nullglob n’est pas null alors on désactive l’option nullglob.

l’objectif de ces 2 lignes est d’activer l’option nullglob (1ère ligne) puis de la repositionner dans son état initiale (2nde ligne) si il a été changé.
