Γράφω ένα σενάριο κελύφους για να εκτελεστεί στο πλαίσιο του KornShell (ksh) στο AIX. Θα ήθελα να χρησιμοποιήσω την εντολή mkdir
για να δημιουργήσω έναν κατάλογο. Αλλά ο κατάλογος μπορεί να υπάρχει ήδη, οπότε δεν θέλω να κάνω τίποτα. Θέλω λοιπόν είτε να ελέγξω για να δω ότι ο κατάλογος δεν υπάρχει, είτε να καταστείλω το σφάλμα "File exists" που πετάει η mkdir
όταν προσπαθεί να δημιουργήσει έναν υπάρχοντα κατάλογο.
Κάποια σκέψη για το πώς να το κάνω καλύτερα αυτό;
Δοκιμάστε mkdir -p
:
mkdir -p foo
Σημειώστε ότι αυτό θα δημιουργήσει επίσης οποιουσδήποτε ενδιάμεσους καταλόγους που δεν υπάρχουν- για παράδειγμα,
mkdir -p foo/bar/baz
θα δημιουργήσει τους καταλόγους foo
, foo/bar
και foo/bar/baz
αν δεν υπάρχουν.
Κάποιες υλοποιήσεις όπως το GNU mkdir
περιλαμβάνουν το mkdir --parents
ως ένα πιο ευανάγνωστο ψευδώνυμο, αλλά αυτό δεν καθορίζεται στην POSIX/Single Unix Specification και δεν είναι διαθέσιμο σε πολλές κοινές πλατφόρμες όπως το macOS, διάφορα BSD και διάφορα εμπορικά Unix, οπότε θα πρέπει να αποφεύγεται.
Αν θέλετε ένα σφάλμα όταν οι κατάλογοι-γονείς δεν υπάρχουν, και θέλετε να δημιουργήσετε τον κατάλογο αν δεν υπάρχει, τότε μπορείτε πρώτα να δοκιμάσετε
για την ύπαρξη του καταλόγου:
[ -d foo ] || mkdir foo
Αυτό θα πρέπει να λειτουργήσει:
$ mkdir -p dir
ή:
if [[ ! -e $dir ]]; then
mkdir $dir
elif [[ ! -d $dir ]]; then
echo "$dir already exists but is not a directory" 1>&2
fi
η οποία θα δημιουργήσει τον κατάλογο αν δεν υπάρχει, αλλά θα σας προειδοποιήσει αν το όνομα του καταλόγου που προσπαθείτε να δημιουργήσετε χρησιμοποιείται ήδη από κάτι άλλο εκτός από έναν κατάλογο.