Controleer of een directory bestaat in een shellscript

Welk commando kan worden gebruikt om te controleren of een directory bestaat of niet, binnen een shellscript?

Oplossing

Om te controleren of een directory bestaat in een shellscript kunt u het volgende gebruiken:

if [ -d "$DIRECTORY" ]; then
  # Control will enter here if $DIRECTORY exists.
fi

Of om te controleren of een directory'niet bestaat:

if [ ! -d "$DIRECTORY" ]; then
  # Control will enter here if $DIRECTORY doesn't exist.
fi

Echter, zoals Jon Ericson aangeeft, kunnen volgende commando's niet werken zoals bedoeld als je er geen rekening mee houdt dat een symbolische link naar een directory ook door deze controle zal komen. Bijvoorbeeld als je dit uitvoert:

ln -s "$ACTUAL_DIR" "$SYMLINK"
if [ -d "$SYMLINK" ]; then 
  rmdir "$SYMLINK" 
fi

zal de foutmelding geven:

rmdir: failed to remove `symlink': Not a directory

Het kan dus zijn dat symbolische links anders behandeld moeten worden, als volgende commando's directories verwachten:

if [ -d "$LINK_OR_DIR" ]; then 
  if [ -L "$LINK_OR_DIR" ]; then
    # It is a symlink!
    # Symbolic link specific commands go here.
    rm "$LINK_OR_DIR"
  else
    # It's a directory!
    # Directory command goes here.
    rmdir "$LINK_OR_DIR"
  fi
fi

Let vooral op de dubbele aanhalingstekens die gebruikt worden om de variabelen te verpakken, de reden hiervoor wordt uitgelegd door 8jean in een ander antwoord.

Als de variabelen spaties of andere ongebruikelijke tekens bevatten, zal het script waarschijnlijk mislukken.

Commentaren (12)

Merk op dat de -d test verrassende resultaten kan opleveren:

$ ln -s tmp/ t
$ if [ -d t ]; then rmdir t; fi
rmdir: directory "t": Path component not a directory

Bestand onder: "Wanneer is een directory geen directory? " Het antwoord: "Wanneer het een symlink is naar een directory." Een iets grondigere test:

if [ -d t ]; then 
   if [ -L t ]; then 
      rm t
   else 
      rmdir t
   fi
fi

Je kunt meer informatie vinden in de Bash handleiding over Bash voorwaardelijke expressies en de [[ builtin command](https://www.gnu.org/software/bash/manual/bash.html#index-_005b) en de [[[ compound commmand](https://www.gnu.org/software/bash/manual/bash.html#index-_005b_005b).

Commentaren (1)

Meer functies met find

  • Controleer het bestaan van de map in sub-mappen:

      found=`find -type d -name "myDirectory"`
      if [ -n "$found"]
      dan
          # De variabele 'found' bevat het volledige pad waar "myDirectory" zich bevindt.
          # Het kan meerdere regels bevatten als er meerdere mappen zijn met de naam "myDirectory".
      fi
  • Controleer het bestaan van een of meer mappen op basis van een patroon in de huidige map:

      found=`find -maxdepth 1 -type d -name "my*"`
      if [ -n "$found"]
      dan
          # De variabele 'found' bevat het volledige pad waar mappen "my*" zijn gevonden.
      fi
  • Beide combinaties. In het volgende voorbeeld wordt het bestaan van de map in de huidige directory gecontroleerd:

      found=`find -maxdepth 1 -type d -name "myDirectory"`
      indien [ -n "$found"]
      dan
          # De variabele 'found' is niet leeg => "myDirectory"` bestaat.
      fi
Commentaren (1)