Έλεγχος αν υπάρχει ένας κατάλογος σε ένα σενάριο κελύφους

Ποια εντολή μπορεί να χρησιμοποιηθεί για να ελέγξετε αν ένας κατάλογος υπάρχει ή όχι, μέσα σε ένα σενάριο κελύφους;

Λύση

Για να ελέγξετε αν ένας κατάλογος υπάρχει σε ένα σενάριο κελύφους μπορείτε να χρησιμοποιήσετε τα εξής:

if [ -d "$DIRECTORY" ]; then
  # Control will enter here if $DIRECTORY exists.
fi

Ή για να ελέγξετε αν ένας κατάλογος δεν υπάρχει:

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

Ωστόσο, όπως επισημαίνει ο Jon Ericson, οι επακόλουθες εντολές μπορεί να μην λειτουργούν όπως προβλέπεται, αν δεν λάβετε υπόψη ότι ένας συμβολικός σύνδεσμος προς έναν κατάλογο θα περάσει επίσης αυτόν τον έλεγχο. Π.χ. εκτελώντας αυτό:

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

θα παράγει το μήνυμα σφάλματος:

Σχόλια (12)

Σημειώστε ότι το τεστ -d μπορεί να δώσει εκπληκτικά αποτελέσματα:

$ ln -s tmp/ t
$ if [ -d t ]; then rmdir t; fi
rmdir: directory "t": Path component not a directory

File under: "When is a directory not a directory?" The answer: "When it's a symlink to a directory." Ένα ελαφρώς πιο ενδελεχές τεστ:

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

Μπορείτε να βρείτε περισσότερες πληροφορίες στο εγχειρίδιο του Bash σχετικά με τις Bash conditional expressions και την [[ ενσωματωμένη εντολή](https://www.gnu.org/software/bash/manual/bash.html#index-_005b) και την [[[ σύνθετη εντολή](https://www.gnu.org/software/bash/manual/bash.html#index-_005b_005b).

Σχόλια (1)

Περισσότερες δυνατότητες χρησιμοποιώντας το find

  • Έλεγχος ύπαρξης του φακέλου μέσα σε υποκαταλόγους:

      ``find -type d -name "myDirectory"`
      if [ -n "$found"]
      then
          # Η μεταβλητή 'found' περιέχει την πλήρη διαδρομή όπου βρίσκεται το "myDirectory".
          # Μπορεί να περιέχει πολλές γραμμές αν υπάρχουν πολλοί φάκελοι με το όνομα "myDirectory".
      fi
  • Έλεγχος ύπαρξης ενός ή περισσότερων φακέλων με βάση ένα μοτίβο μέσα στον τρέχοντα κατάλογο:

      found=`find -maxdepth 1 -type d -name "my*"`
      if [ -n "$found"]
      then
          # Η μεταβλητή 'found' περιέχει την πλήρη διαδρομή όπου βρέθηκαν οι φάκελοι "my*".
      fi
  • Και οι δύο συνδυασμοί. Στο ακόλουθο παράδειγμα, ελέγχεται η ύπαρξη του φακέλου στον τρέχοντα κατάλογο:

      ``find -maxdepth 1 -type d -name "myDirectory"`
      if [ -n "$found"]
      then
          # Η μεταβλητή 'found' δεν είναι κενή => "myDirectory"` υπάρχει.
      fi
Σχόλια (1)