# BASH : savoir si une commande a fait quelque chose

**URL:** <https://www.debian-fr.org/t/bash-savoir-si-une-commande-a-fait-quelque-chose/64526>\
**Category:** Programmation\
**Created:** [Février 21, 2016, 9:10 UTC](https://www.debian-fr.org/t/bash-savoir-si-une-commande-a-fait-quelque-chose/64526 "2016-02-21T21:10:52Z")\
**Posts on this page:** 8\
**Page:** 1

<div class="post-metadata">

**Author:** ![Arisoy](https://www.debian-fr.org/letter_avatar_proxy/v4/letter/a/13edae/32.png) [@Arisoy](https://www.debian-fr.org/u/Arisoy)\
**Post date:** [Février 21, 2016, 9:10 UTC](https://www.debian-fr.org/t/bash-savoir-si-une-commande-a-fait-quelque-chose/64526/1 "2016-02-21T21:10:52Z")

</div>

Bonjour,

J’exécute ces commandes dans un script :

[code]dOssier="/media/Test/“  
dOssierTxt=”/media/Test/Txt/"

find $dOssier -type f -name “_.txt" ! -path $dOssierTxt"_” -exec mv {} $dOssierTxt ;[/code]

La commande va donc chercher les fichier .txt dans /media/Test/ pour les déplacer dans /media/Test/Txt/

J’aimerais exécuter un printf ou un echo à la suite de cette commande uniquement si celle-ci déplace effectivement quelque chose.

Avez-vous une idée de comment je peux faire ça?

Merci

---

<div class="post-metadata">

**Author:** ![Mimoza](https://www.debian-fr.org/user_avatar/www.debian-fr.org/mimoza/32/3858_2.png) [@Mimoza](https://www.debian-fr.org/u/Mimoza)\
**Post date:** [Février 21, 2016, 9:10 UTC](https://www.debian-fr.org/t/bash-savoir-si-une-commande-a-fait-quelque-chose/64526/2 "2016-02-21T21:10:53Z")

</div>

Tu compte le nombre de fichier dans le répertoire destination avant et après copie, s’il y a un delta alors il y a eu copie …  
Sinon que te donne un `$?` si aucune copie a été effectué ?

---

<div class="post-metadata">

**Author:** ![anon96191775](https://www.debian-fr.org/letter_avatar_proxy/v4/letter/a/71c47a/32.png) [@anon96191775](https://www.debian-fr.org/u/anon96191775)\
**Post date:** [Février 21, 2016, 9:10 UTC](https://www.debian-fr.org/t/bash-savoir-si-une-commande-a-fait-quelque-chose/64526/3 "2016-02-21T21:10:53Z")

</div>

Un contournement serait d’utiliser l’option [mono]-v[/mono] de mv pour voir immédiatement s’il y a ou non déplacement de fichiers.

Mimoza : Ta proposition fonctionnera, _sauf_ dans le cas où les fichiers déplacés en remplacent d’autres dans le répertoire de destination.

---

<div class="post-metadata">

**Author:** ![Arisoy](https://www.debian-fr.org/letter_avatar_proxy/v4/letter/a/13edae/32.png) [@Arisoy](https://www.debian-fr.org/u/Arisoy)\
**Post date:** [Février 21, 2016, 9:10 UTC](https://www.debian-fr.org/t/bash-savoir-si-une-commande-a-fait-quelque-chose/64526/4 "2016-02-21T21:10:53Z")

</div>

> [@Mimoza](#):
>
> Tu compte le nombre de fichier dans le répertoire destination avant et après copie, s’il y a un delta alors il y a eu copie …

Justement j’aurais voulu éviter de passer par ça. Mais je crois que je vais pas avoir le choix.

[quote=«&nbsp;Mimoza&nbsp;»]Sinon que te donne un

`$?`si aucune copie a été effectué ?[/quote]  
J’avais essayé ça déjà (c’est vrai que j’aurais pu le dire). Enfait [mono]$?[/mono] me retourne 0 quoi qu’il arrive.

> [@vv222](#):
>
> Un contournement serait d’utiliser l’option -v de mv pour voir immédiatement s’il y a ou non déplacement de fichiers.

Justement j’aimerais utiliser le [mono]-v[/mono] dans ma commande et écrire quelque chose ensuite à l’aide de printf. Mais écrire quelque chose seulement si il y’a eu au moins un déplacement.

Je laisse encore le sujet ouvert quelques jours au cas ou quelqu’un passe avec une idée 🙂 Sinon j’utiliserais la comparaison du nombre de fichiers avant et après…

---

<div class="post-metadata">

**Author:** ![lroy](https://www.debian-fr.org/letter_avatar_proxy/v4/letter/l/0ea827/32.png) [@lroy](https://www.debian-fr.org/u/lroy)\
**Post date:** [Février 21, 2016, 9:10 UTC](https://www.debian-fr.org/t/bash-savoir-si-une-commande-a-fait-quelque-chose/64526/5 "2016-02-21T21:10:53Z")

</div>

version bazooka/mouche :

```auto
dOssier="/media/Test/"
dOssierTxt="/media/Test/Txt/"

find $dOssier -type f -name "*.txt" ! -path $dOssierTxt"*" -print0 | xargs -0r sh -c '
  dest=$1
  shift
  for i in "$@"; do
    mv "$i" "$dest"
  done
  printf "blablabla\n"
' sh $dOssierTxt
```

---

<div class="post-metadata">

**Author:** ![Mimoza](https://www.debian-fr.org/user_avatar/www.debian-fr.org/mimoza/32/3858_2.png) [@Mimoza](https://www.debian-fr.org/u/Mimoza)\
**Post date:** [Février 21, 2016, 9:10 UTC](https://www.debian-fr.org/t/bash-savoir-si-une-commande-a-fait-quelque-chose/64526/6 "2016-02-21T21:10:54Z")

</div>

La solution de Iroy n’est pas si sale que ça, finalement au lieu de le faire en 1 ligne on la décompose pour pour tracer ce qui est fait et en plus tu pourra avoir le retour de la commande [mono]mv[/mono]

---

<div class="post-metadata">

**Author:** ![anon29980398](https://www.debian-fr.org/letter_avatar_proxy/v4/letter/a/f4b2a3/32.png) [@anon29980398](https://www.debian-fr.org/u/anon29980398)\
**Post date:** [Février 21, 2016, 9:10 UTC](https://www.debian-fr.org/t/bash-savoir-si-une-commande-a-fait-quelque-chose/64526/7 "2016-02-21T21:10:59Z")

</div>

[code]#!/bin/bash

repSource="/media/Test/“  
repCible=”/media/Test/Txt/"  
nomExt=“txt”

function deplace() {

if [[-e “${repCible}/$(basename $1)”]]  
then {  
echo -en "\e[41m - KO --\> \e[0m $1\n"  
exit 1  
}  
fi

mv “$1” “${repCible}”

if [[! -e “${repCible}/$(basename $1)”]]  
then {  
echo -en "\e[41m - KO --\> \e[0m $1\n"  
exit 1  
}  
fi

echo -en “\e[1;32m - OK - \e[0m $1\n”  
}

export -f deplace  
export repCible

find “${repSource}” -type f -name “\*.${nomExt}” ! -path “${repCible}” -exec /bin/bash -c ‘deplace “{}”’ ;[/code]

---

<div class="post-metadata">

**Author:** ![Arisoy](https://www.debian-fr.org/letter_avatar_proxy/v4/letter/a/13edae/32.png) [@Arisoy](https://www.debian-fr.org/u/Arisoy)\
**Post date:** [Février 21, 2016, 9:11 UTC](https://www.debian-fr.org/t/bash-savoir-si-une-commande-a-fait-quelque-chose/64526/8 "2016-02-21T21:11:07Z")

</div>

Bonjour et merci ceux qui m’ont répondu.

J’ai finalement opté pour une autre solution a laquelle j’ai pensé. Je rends la commande [mono]mv[/mono] bavarde avec [mono]-v[/mono]. Et j’enregistre ce retour dans une variable que je peux tester ensuite.

J’aime quand c’est simple 🙂

Si vous avez des remarques n’hésitez pas. En attendant je passe déjà le sujet en résolu.

[code]dOssier="/media/Test/“  
dOssierTxt=”/media/Test/Txt/"

rEtour=$(find $dOssier -type f -name “_.txt" ! -path $dOssierTxt"_” -exec mv -v {} $dOssierTxt 😉

if [“$rEtour”]; then  
printf "Des Fichiers ont été déplacés.\n"  
fi[/code]
