BASH : savoir si une commande a fait quelque chose

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

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é ?

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.

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

[quote=“Mimoza”]Sinon que te donne un

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.

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 :slightly_smiling: Sinon j’utiliserais la comparaison du nombre de fichiers avant et après…

version bazooka/mouche :

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

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]

[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]

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 :slightly_smiling:

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 :wink:

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