Hvilken kommando kan brukes til å sjekke om en katalog finnes eller ikke, i et shell-skript?
For å sjekke om en katalog finnes i et shell-skript, kan du bruke følgende:
if [ -d "$DIRECTORY" ]; then
# Control will enter here if $DIRECTORY exists.
fi
Eller for å sjekke om en katalog ikke finnes:
if [ ! -d "$DIRECTORY" ]; then
# Control will enter here if $DIRECTORY doesn't exist.
fi
Men som Jon Ericson påpeker, kan det hende at påfølgende kommandoer ikke fungerer som tiltenkt hvis du ikke tar hensyn til at en symbolsk lenke til en katalog også vil passere denne kontrollen. F.eks. ved å kjøre dette:
ln -s "$ACTUAL_DIR" "$SYMLINK"
if [ -d "$SYMLINK" ]; then
rmdir "$SYMLINK"
fi
Vil produsere feilmeldingen:
rmdir: failed to remove `symlink': Not a directory
Så symbolske lenker må kanskje behandles annerledes hvis påfølgende kommandoer forventer kataloger:
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
Legg spesielt merke til de doble anførselstegnene som brukes for å omslutte variablene, årsaken til dette er forklart av 8jean i et annet svar.
Hvis variablene inneholder mellomrom eller andre uvanlige tegn, vil det sannsynligvis føre til at skriptet feiler.
Merk at -d-testen kan gi noen overraskende resultater:
$ ln -s tmp/ t
$ if [ -d t ]; then rmdir t; fi
rmdir: directory "t": Path component not a directory
Arkiver under: "Når er en katalog ikke en katalog?" Svaret: "Når det er en symbolsk lenke til en katalog." En litt grundigere test:
if [ -d t ]; then
if [ -L t ]; then
rm t
else
rmdir t
fi
fi
Du finner mer informasjon i Bash-manualen om Bash conditional expressions og [[
built-in command](https://www.gnu.org/software/bash/manual/bash.html#index-_005b) og [[[
compound commmand](https://www.gnu.org/software/bash/manual/bash.html#index-_005b_005b).
finne
Sjekk eksistensen av mappen i underkataloger:
found=`find -type d -navn "myDirectory"`
if [ -n "$found"] (hvis [ -n "$found"])
then
# Variabelen 'found' inneholder den fullstendige banen der "myDirectory" er.
# Den kan inneholde flere linjer hvis det finnes flere mapper med navnet "myDirectory".
fi
Sjekk eksistensen av en eller flere mapper basert på et mønster i den gjeldende katalogen:
found=`find -maxdepth 1 -type d -name "my*".
if [ -n "$found"] if [ -n "$funnet"]
then
# Variabelen 'found' inneholder den fullstendige banen der mappene "my*" har blitt funnet.
fi
Begge kombinasjonene. I følgende eksempel sjekkes det om mappen finnes i den gjeldende katalogen:
found=`find -maxdepth 1 -type d -name "myDirectory"`
if [ -n "$found"] if [ -n "$funn"]
then
# Variabelen 'found' er ikke tom => "myDirectory"` eksisterer.
fi