Vraag Controleer of een map bestaat in een shellscript


Welke opdracht kan worden gebruikt om te controleren of een map bestaat of niet, binnen een shell-script?


2988
2017-09-12 20:06


oorsprong


antwoorden:


Om te controleren of een map 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 map niet bestaat:

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

Echter, als Jon Ericson wijst erop dat volgende opdrachten mogelijk niet werken zoals bedoeld, als u er geen rekening mee houdt dat een symbolische koppeling naar een directory ook deze controle doorstaat. Bijv. dit runnen:

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

Zal de foutmelding produceren:

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

Dus symbolische links moeten misschien anders worden behandeld, als volgende opdrachten mappen 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 worden gebruikt om de variabelen in te pakken, de reden hiervoor wordt verklaard door 8jean in een ander antwoord.

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


4132
2017-09-12 20:07



Vergeet niet om altijd variabelen in dubbele aanhalingstekens in te voegen wanneer ernaar wordt verwezen een bash-script. Kinderen groeien tegenwoordig op met het idee dat ze spaties en heel veel andere grappige personages in hun directorynamen kunnen hebben. (Ruimtes! In mijn tijd hadden we geen mooie plekken!;))

Op een dag zal een van die kinderen je script uitvoeren $DIRECTORY ingesteld op "My M0viez" en je script zal opblazen. Dat wil je niet. Gebruik dit dus.

if [ -d "$DIRECTORY" ]; then
    # Will enter here if $DIRECTORY exists, even if it contains spaces
fi

454
2017-09-15 22:00



Merk op -d test kan enkele verrassende resultaten 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 map geen map?" Het antwoord: "Wanneer het een symlink naar een map is." Een iets meer grondige test:

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

U kunt meer informatie vinden in de Bash-handleiding op Voorwaardelijke uitdrukkingen verbergen en de [ ingebouwde opdracht en de [[ samengestelde opdracht.


203
2017-09-12 20:26



Ik vind de double-bracket versie van test maakt schrijflogica testen natuurlijker:

if [[ -d "${DIRECTORY}" && ! -L "${DIRECTORY}" ]] ; then
    echo "It's a bona-fide directory"
fi

198
2017-09-12 21:33



Kortere vorm:

[ -d "$DIR" ] && echo "Yes"

125
2017-09-12 21:08



Om te controleren of een map bestaat, kunt u een eenvoudige structuur als deze gebruiken:

if [ -d directory/path to a directory ] ; then
#Things to do

else #if needed #also: elif [new condition] 
# things to do
fi

Je kunt het ook in negatief doen

if [ ! -d directory/path to a directory ] ; then
# things to do when not an existing directory

Notitie: Wees voorzichtig, laat lege plekken aan beide zijden van zowel de openings- als de sluitbraces.

Met dezelfde syntaxis die u kunt gebruiken:

-e: any kind of archive 

-f: file 

-h: symbolic link 

-r: readable file 

-w: writable file 

-x: executable file 

-s: file size greater than zero 

118
2018-04-08 02:50



if [ -d "$DIRECTORY" ]; then  
    # Here if $DIRECTORY exists  
fi

94
2018-04-15 08:07



Je kunt gebruiken test -d (zien man test).

-d file       Waar als het bestand bestaat en een map is.

Bijvoorbeeld:

test -d "/etc" && echo Exists || echo Does not exist

Merk op test opdracht is hetzelfde als voorwaardelijke uitdrukking [ (zien: man [), dus het is draagbaar in shell-scripts.

[ - Dit is een synoniem voor de test ingebouwd, maar het laatste argument moet letterlijk zijn ], om de opening te evenaren [.

Voor mogelijke opties of verdere hulp, controleer:

  • help [
  • help test
  • man test of man [

73
2017-09-12 21:25



Of voor iets volkomen nutteloos:

[ -d . ] || echo "No"

55
2017-08-17 14:02