Kako mkdir samo, če dir še ne obstaja?

Pišem skriptno lupino, ki se zažene pod KornShell (ksh) v sistemu AIX. Za ustvarjanje imenika želim uporabiti ukaz mkdir. Toda imenik morda že obstaja, in v tem primeru ne želim storiti ničesar. Zato želim bodisi preveriti, ali imenik ne obstaja, bodisi odpraviti napako "Datoteka obstaja", ki jo vrže ukaz mkdir, ko poskuša ustvariti obstoječi imenik.

Kaj menite o tem, kako to najbolje storiti?

Rešitev

Poskusite mkdir -p:

mkdir -p foo

Upoštevajte, da bo to ustvarilo tudi vse vmesne imenike, ki ne obstajajo; na primer,

mkdir -p foo/bar/baz

bo ustvaril imenike foo, foo/bar in foo/bar/baz, če ti še ne obstajajo.

Nekatere implementacije, kot je GNU mkdir, vključujejo mkdir --parents kot bolj berljiv vzdevek, vendar to ni določeno v specifikaciji POSIX/Single Unix Specification in ni na voljo na številnih običajnih platformah, kot so macOS, različne BSD in različni komercialni Unixi, zato se mu je treba izogniti.

Če želite napako, kadar nadrejeni imeniki ne obstajajo, in želite ustvariti imenik, če ta ne obstaja, lahko najprej testirate obstoj imenika:

[ -d foo ] || mkdir foo
Komentarji (11)

To bi moralo delovati:

$ mkdir -p dir

ali:

if [[ ! -e $dir ]]; then
    mkdir $dir
elif [[ ! -d $dir ]]; then
    echo "$dir already exists but is not a directory" 1>&2
fi

ki bo ustvaril imenik, če ta ne obstaja, vendar vas bo opozoril, če ime imenika, ki ga poskušate ustvariti, že uporablja kaj drugega kot imenik.

Komentarji (3)

Uporabite zastavico -p.

man mkdir
mkdir -p foo
Komentarji (0)