Προς το περιεχόμενο

Πρόγραμμα φλοιού bash shell σε Linux


nikolasR200

Προτεινόμενες αναρτήσεις

Δημοσ.

Καλησπέρα,

φτιάχνω ένα πρόγραμμα στα πλαίσια μιας εργασίας, το οποίο παίρνει όρισμα έναν κατάλογο (directory) και αρχίζει να σκανάρει τα περιεχόμενα-υποκαταλόγους και όποιον υποκατάλογο βρίσκει άδειο τον διαγράφει..και ξεκινώντας από τα φύλλα του δένδρου κατευθύνεται προς την ρίζα..

δηλαδή έστω ότι έχουμε το directory dir1/dir2/dir3

και βάζουμε σαν όρισμα το dir1 (αν θεωρήσουμε ότι οι κατάλογοι δεν έχουν τίποτα άλλο παρά μόνο τους υποκαταλόγους) το πρόγραμμα θα εξετάσει πρώτα τον dir3 αν τον βρει κενό θα τον διαγράψει, στη συνέχεια θα εξετάσει το dir2 αν το βρει κενό θα το διαγράψει κ.ο.κ.

Ωστόσο αντιμετωπίζω ένα πρόβλημα. Αν για παράδειγμα στον dir3 δεν έχουμε το δικαίωμα read άρα δεν μπορεί να εκτελεστεί η εντολή ls δεν μπορεί το πρόγραμμα να γνωρίζει αν όντως είναι άδειος ή όχι..προφανώς αν προσπαθήσει να τον διαγράψει και δεν είναι άδειος θα βγει μήνυμα λάθους, αλλά αναρρωτιόμουν αν υπάρχει τρόπος παρά την έλλειψη δικαιωμάτων -r να ελέγξει το πρόγραμμα αν ο φάκελος είναι άδειος ώστε να βγάλω δικό μου μήνυμα λάθους μέσα από το πρόγραμμα και να μην "αναγκαστεί" να μου βγάλει ο φλοιός..

Δημοσ.
Καλησπέρα,

φτιάχνω ένα πρόγραμμα στα πλαίσια μιας εργασίας, το οποίο παίρνει όρισμα έναν κατάλογο (directory) και αρχίζει να σκανάρει τα περιεχόμενα-υποκαταλόγους και όποιον υποκατάλογο βρίσκει άδειο τον διαγράφει..και ξεκινώντας από τα φύλλα του δένδρου κατευθύνεται προς την ρίζα..

δηλαδή έστω ότι έχουμε το directory dir1/dir2/dir3

και βάζουμε σαν όρισμα το dir1 (αν θεωρήσουμε ότι οι κατάλογοι δεν έχουν τίποτα άλλο παρά μόνο τους υποκαταλόγους) το πρόγραμμα θα εξετάσει πρώτα τον dir3 αν τον βρει κενό θα τον διαγράψει, στη συνέχεια θα εξετάσει το dir2 αν το βρει κενό θα το διαγράψει κ.ο.κ.

Ωστόσο αντιμετωπίζω ένα πρόβλημα. Αν για παράδειγμα στον dir3 δεν έχουμε το δικαίωμα read άρα δεν μπορεί να εκτελεστεί η εντολή ls δεν μπορεί το πρόγραμμα να γνωρίζει αν όντως είναι άδειος ή όχι..προφανώς αν προσπαθήσει να τον διαγράψει και δεν είναι άδειος θα βγει μήνυμα λάθους, αλλά αναρρωτιόμουν αν υπάρχει τρόπος παρά την έλλειψη δικαιωμάτων -r να ελέγξει το πρόγραμμα αν ο φάκελος είναι άδειος ώστε να βγάλω δικό μου μήνυμα λάθους μέσα από το πρόγραμμα και να μην "αναγκαστεί" να μου βγάλει ο φλοιός..

 

Δοκίμασε να κάνεις ls -l σε κάθε φάκελο ελέγχοντας το μέγεθός του και να έχει δικαιώματα ανάγνωσης.

Δημοσ.
αν θεωρήσουμε ότι οι κατάλογοι δεν έχουν τίποτα άλλο παρά μόνο τους υποκαταλόγους

 

Αν το θεωρήσουμε αυτό τότε δεν θα πρεπει να διαγραφούν όλοι οι κατάλογοι κάτω από την ρίζα?

Δημοσ.

Αυτό που σίγουρα μπορείς να δεις για έναν φάκελο που δεν έχεις read δικαιώματα είναι αν περιέχει άλλους φακέλου μέσα. Αυτό γίνεται με το πεδίο "Number of links" της εντολής ls -l. Είναι το δεύτερο πεδίο.

 

drwx------ 4 root root 144 Aug 29 20:40 tst

 

Αν είναι μεγαλύτερο του 2 (μην ξεχνάμε το . και ..) τότε σίγουρα έχει και άλλους καταλόγους μέσα. Για το αν υπάρχουν αρχεία μέσα, ή αν οι φάκελοι είναι άδειοι δεν γνωρίζω πως.

Δημοσ.

η ls εντολή φέρνει μήνυμα λάθους permission denied σε περίπτωση που δεν έχουμε το read δικαίωμα..αυτό που λέει ο φίλος firewalker δεν το γνωρίζω, αλλά οπωσδήποτε με νοιάζει έστω το αν υπάρχει αρχείο μέσα..

εγώ σκέφτηκα να κάνω απλά μια επιπλέον συνθήκη να προσπαθεί να τον διαγράψει έτσι και αλλιώς τον φάκελο και σε περίπτωση που είναι άδειος αυτό θα γίνεται με επιτυχια σε περίπτωση που δεν είναι άδειος βγάζει ούτως ή άλλως μήνυμα directory not empty οπότε απλά φορτώνομαι ένα επιπλέον μήνυμα λάθους που απλά ήθελα να αποφύγω..

Δημοσ.
η ls εντολή φέρνει μήνυμα λάθους permission denied σε περίπτωση που δεν έχουμε το read δικαίωμα..αυτό που λέει ο φίλος firewalker δεν το γνωρίζω, αλλά οπωσδήποτε με νοιάζει έστω το αν υπάρχει αρχείο μέσα..

εγώ σκέφτηκα να κάνω απλά μια επιπλέον συνθήκη να προσπαθεί να τον διαγράψει έτσι και αλλιώς τον φάκελο και σε περίπτωση που είναι άδειος αυτό θα γίνεται με επιτυχια σε περίπτωση που δεν είναι άδειος βγάζει ούτως ή άλλως μήνυμα directory not empty οπότε απλά φορτώνομαι ένα επιπλέον μήνυμα λάθους που απλά ήθελα να αποφύγω..

 

Για να δούμε την rmdir

 

>Usage: rmdir [OPTION]... DIRECTORY...
Remove the DIRECTORY(ies), if they are empty.

    [b] --ignore-fail-on-non-empty
                 ignore each failure that is solely because a directory
                   is non-empty[/b]
 -p, --parents   remove DIRECTORY and its ancestors; e.g., `rmdir -p a/b/c' is
                   similar to `rmdir a/b/c a/b a'
 -v, --verbose   output a diagnostic for every directory processed
     --help     display this help and exit
     --version  output version information and exit

Δημοσ.

Νομίζω ότι αυτο που παρέθεσες Aztec επιβεβαιώνει αυτό που έγραψα παραπάνω..σωστά?

 

και μια άσχετη ερώτηση με το συγκεκριμένο θέμα αλλά συγκεκριμένη με το πνεύμα του θέματος..δηλαδή προγραμματισμό σε linux bash..

"while IFS= read -r -n1 c" έχω αυτή την while..η οποία διαβάζει ένα κείμενο και μου δίνει αριθμό χαρακτήρων..

ξέρω ότι το IFS (internal field seperator) αφορά το πως χωρίζονται οι χαρακτήρες..

ξέρω ότι το c είναι μια μεταβλητή που χρησιμοποιώ για να αναγνωριστεί ο κάθε χαρακτήρας..

αλλά δε ξέρω το read -r -n1 πως σχετίζεται και πως δένει ολο το γλυκό μαζί..μπορεί κάποιος να μου εξηγήσει?

έχω βρει αυτή την "εξήγηση"

> the while loop, read one char at a time
while IFS= read -r -n1 c
do
# counter letter a, b, c
[ "$c" == "a" ] && (( a++ ))
[ "$c" == "b" ] && (( b++ ))
[ "$c" == "c" ] && (( cc++ ))
done < "$INPUT"

αλλά το σχόλιο ότι η while loop διαβάζει ένα χαρακτήρα τη φορά δεν μου είναι αρκετό να καταλάβω τον ρόλο κάθε όρου στην εκτέλεση της συνθήκης..

Δημοσ.
read -r -n1 c

 

http://ss64.com/bash/read.html

-n nchars

read returns after reading nchars characters rather

than waiting for a complete line of input.

-nαριθμός

διαβάζει τόσους χαρακτήρες όσοι ο αριθμός

αντί να περιμένει μιά πλήρη γραμμή εισόδου

 

 

-r

If this option is given, backslash does not act as an escape character.

The backslash is considered to be part of the line. In particular, a backslash-newline

pair may not be used as a line continuation.

η ανάστροφη "λοξή" δεν είναι χαρακτήρας διαφυγής, αλλά μέρος της γραμμής

 

.

Δημοσ.
σ'ευχαριστώ πάρα πολύ ήταν ό,τι χρειαζόμουν..!! :)

 

στο Linux section ο κ apoikos βάζει δύσκολα θέματα

και είμαστε συνέχεια με τις σημειώσεις πρόχειρες ! :mrgreen:

 

.

Αρχειοθετημένο

Αυτό το θέμα έχει αρχειοθετηθεί και είναι κλειστό για περαιτέρω απαντήσεις.

  • Δημιουργία νέου...