"bash: [: too many arguments".

michel42 -  
zipe31 Messages postés 34620 Date d'inscription   Statut Contributeur Dernière intervention   -
Bonjour,
Le second IF me donne "bash: [: too many arguments".

#!/bin/bash
#Script nettoyage.sh qui a pour action de purger les dossiers "/usr/local/applications/nettoayge" et "/usr/local/applications/*/nettoyage" lorsque le timestamp de change a plus de 10 jours ##

# Variables
REP="/usr/local/applications/nettoyage"
REP2="/usr/local/applications/*/nettoyage"

# Vérification que les répertoires sont présents

if [ -d $REP ]; then
find "$REP" -maxdepth 1 -ctime +10 -exec rm -rf {} \;
else
echo "Le répertoire $REP n'est pas présent sur ce serveur"
fi
if [ -d $REP2 ]; then
find "$REP2" -maxdepth 1 -ctime +10 -exec rm -rf {} \;
else
echo "Le répertoire $REP2 n'est pas présent sur ce serveur"
fi

Merci à vous,

2 réponses

  1. zipe31 Messages postés 34620 Date d'inscription   Statut Contributeur Dernière intervention   6 501
     
    Salut,

    L'erreur vient du fait que ta syntaxe
    if [ -d $REP2 ]
    une fois développée par le shell ne correspond plus à l'attente du test.

    En fait c'est comme si tu écrivais :
    test -d /usr/local/applications/toto/nettoyage /usr/local/applications/tata/nettoyage /usr/local/applications/titi/nettoyage etc.
    La commande
    test -d
    n'attend qu'un paramètre derrière et non pas plusieurs, sauf si on emploie l'option
    -a
    ou
    -o
    ;-(

    De plus, ton test est inutile, la commande
    find
    seule suffit, elle fera le tri d'elle même. Si elle trouve un dossier nettoyage elle exécutera le reste de la commande, dans le cas contraire elle ne fera rien.
    0
  2. michel42
     
    Je dois donc remplacé la commande -d par la commande -a ou -o ? ou dois-je mettre la commande avec le -d aussi.

    Merci de votre réponse
    0
    1. zipe31 Messages postés 34620 Date d'inscription   Statut Contributeur Dernière intervention   6 501
       
      Euh... non, pas tout a fait ;-\

      La syntaxe pour tester plusieurs paramètres est la suivante :

      if [ -d toto -o -d titi -o -d tata ]; then ... else ... fi

      Mais comme précisé dans ma réponse précédente, à mon avis ces tests ne servent à rien. La commande
      find
      devrait faire le boulot toute seule :

      find ${REP} ${REP2} -maxdepth 1 -ctime +10 -exec rm -rf {} \; 2>/dev/null
      0
    2. michel42
       
      oui mais la commande dans mon cas serait :

      if [ -d -o /usr/local/applications/*/nettoyage]; then ... else ... fi
      0
    3. zipe31 Messages postés 34620 Date d'inscription   Statut Contributeur Dernière intervention   6 501
       
      Non ! Un répertoire par argument :

      if [ -d /usr/local/applications/rep1/nettoyage -o -d /usr/local/applications/rep2/nettoyage -o -d etc.
      0
    4. michel42
       
      ok d'accord, mais j'ai énormément de répertoire, quand je pourrai optimiser çà ?
      0
    5. zipe31 Messages postés 34620 Date d'inscription   Statut Contributeur Dernière intervention   6 501
       
      0