Hvilken kommando kan bruges til at kontrollere, om en mappe findes eller ej, i et shellscript?
For at kontrollere, om en mappe findes i et shellscript, kan du bruge følgende:
if [ -d "$DIRECTORY" ]; then
# Control will enter here if $DIRECTORY exists.
fi
Eller for at kontrollere, om en mappe ikke eksisterer:
if [ ! -d "$DIRECTORY" ]; then
# Control will enter here if $DIRECTORY doesn't exist.
fi
Men som Jon Ericson påpeger, kan det være, at efterfølgende kommandoer ikke virker efter hensigten, hvis du ikke tager højde for, at et symbolsk link til en mappe også vil bestå denne kontrol. F.eks. ved at køre dette:
ln -s "$ACTUAL_DIR" "$SYMLINK"
if [ -d "$SYMLINK" ]; then
rmdir "$SYMLINK"
fi
vil give følgende fejlmeddelelse:
rmdir: failed to remove `symlink': Not a directory
Så symbolske links skal muligvis behandles anderledes, hvis efterfølgende kommandoer forventer mapper:
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
Læg især mærke til de dobbelte anførselstegn, der bruges til at omslutte variablerne, grunden hertil forklares af 8jean i et andet svar.
Hvis variablerne indeholder mellemrum eller andre usædvanlige tegn, vil det sandsynligvis få scriptet til at mislykkes.
Bemærk, at -d-testen kan give nogle overraskende resultater:
$ ln -s tmp/ t
$ if [ -d t ]; then rmdir t; fi
rmdir: directory "t": Path component not a directory
Fil under: "Hvornår er en mappe ikke en mappe?" Svaret: "Når det er et symbolsk link til en mappe." En lidt mere grundig test:
if [ -d t ]; then
if [ -L t ]; then
rm t
else
rmdir t
fi
fi
Du kan finde flere oplysninger i Bash-manualen om Bash betingede udtryk og den [[
indbyggede kommando](https://www.gnu.org/software/bash/manual/bash.html#index-_005b) og den [[[
sammensatte kommando](https://www.gnu.org/software/bash/manual/bash.html#index-_005b_005b).
find
Kontroller mappens eksistens i undermapper:
found=`find -type d -name "myDirectory"`
if [ -n "$found"]
then
# Variablen 'found' indeholder den fulde sti, hvor "myDirectory" befinder sig.
# Den kan indeholde flere linjer, hvis der er flere mapper med navnet "myDirectory".
fi
Kontroller eksistensen af en eller flere mapper baseret på et mønster i den aktuelle mappe:
found=`find -maxdepth 1 -type d -name "my*"`
if [ -n "$found"]
then
# Variablen 'found' indeholder den fulde sti, hvor mapper "my*" er blevet fundet.
fi
Begge kombinationer. I det følgende eksempel kontrolleres det, om mappen findes i den aktuelle mappe:
found=`find -maxdepth 1 -type d -name "myDirectory"`
if [ -n "$found"]
then
# Variablen 'found' er ikke tom => "myDirectory"` findes.
fi