nikolasR200 Δημοσ. 29 Αυγούστου 2010 Δημοσ. 29 Αυγούστου 2010 Καλησπέρα, φτιάχνω ένα πρόγραμμα στα πλαίσια μιας εργασίας, το οποίο παίρνει όρισμα έναν κατάλογο (directory) και αρχίζει να σκανάρει τα περιεχόμενα-υποκαταλόγους και όποιον υποκατάλογο βρίσκει άδειο τον διαγράφει..και ξεκινώντας από τα φύλλα του δένδρου κατευθύνεται προς την ρίζα.. δηλαδή έστω ότι έχουμε το directory dir1/dir2/dir3 και βάζουμε σαν όρισμα το dir1 (αν θεωρήσουμε ότι οι κατάλογοι δεν έχουν τίποτα άλλο παρά μόνο τους υποκαταλόγους) το πρόγραμμα θα εξετάσει πρώτα τον dir3 αν τον βρει κενό θα τον διαγράψει, στη συνέχεια θα εξετάσει το dir2 αν το βρει κενό θα το διαγράψει κ.ο.κ. Ωστόσο αντιμετωπίζω ένα πρόβλημα. Αν για παράδειγμα στον dir3 δεν έχουμε το δικαίωμα read άρα δεν μπορεί να εκτελεστεί η εντολή ls δεν μπορεί το πρόγραμμα να γνωρίζει αν όντως είναι άδειος ή όχι..προφανώς αν προσπαθήσει να τον διαγράψει και δεν είναι άδειος θα βγει μήνυμα λάθους, αλλά αναρρωτιόμουν αν υπάρχει τρόπος παρά την έλλειψη δικαιωμάτων -r να ελέγξει το πρόγραμμα αν ο φάκελος είναι άδειος ώστε να βγάλω δικό μου μήνυμα λάθους μέσα από το πρόγραμμα και να μην "αναγκαστεί" να μου βγάλει ο φλοιός..
Τάσος_Δ Δημοσ. 29 Αυγούστου 2010 Δημοσ. 29 Αυγούστου 2010 Καλησπέρα,φτιάχνω ένα πρόγραμμα στα πλαίσια μιας εργασίας, το οποίο παίρνει όρισμα έναν κατάλογο (directory) και αρχίζει να σκανάρει τα περιεχόμενα-υποκαταλόγους και όποιον υποκατάλογο βρίσκει άδειο τον διαγράφει..και ξεκινώντας από τα φύλλα του δένδρου κατευθύνεται προς την ρίζα.. δηλαδή έστω ότι έχουμε το directory dir1/dir2/dir3 και βάζουμε σαν όρισμα το dir1 (αν θεωρήσουμε ότι οι κατάλογοι δεν έχουν τίποτα άλλο παρά μόνο τους υποκαταλόγους) το πρόγραμμα θα εξετάσει πρώτα τον dir3 αν τον βρει κενό θα τον διαγράψει, στη συνέχεια θα εξετάσει το dir2 αν το βρει κενό θα το διαγράψει κ.ο.κ. Ωστόσο αντιμετωπίζω ένα πρόβλημα. Αν για παράδειγμα στον dir3 δεν έχουμε το δικαίωμα read άρα δεν μπορεί να εκτελεστεί η εντολή ls δεν μπορεί το πρόγραμμα να γνωρίζει αν όντως είναι άδειος ή όχι..προφανώς αν προσπαθήσει να τον διαγράψει και δεν είναι άδειος θα βγει μήνυμα λάθους, αλλά αναρρωτιόμουν αν υπάρχει τρόπος παρά την έλλειψη δικαιωμάτων -r να ελέγξει το πρόγραμμα αν ο φάκελος είναι άδειος ώστε να βγάλω δικό μου μήνυμα λάθους μέσα από το πρόγραμμα και να μην "αναγκαστεί" να μου βγάλει ο φλοιός.. Δοκίμασε να κάνεις ls -l σε κάθε φάκελο ελέγχοντας το μέγεθός του και να έχει δικαιώματα ανάγνωσης.
bnvdarklord Δημοσ. 29 Αυγούστου 2010 Δημοσ. 29 Αυγούστου 2010 αν θεωρήσουμε ότι οι κατάλογοι δεν έχουν τίποτα άλλο παρά μόνο τους υποκαταλόγους Αν το θεωρήσουμε αυτό τότε δεν θα πρεπει να διαγραφούν όλοι οι κατάλογοι κάτω από την ρίζα?
pinball_elf Δημοσ. 29 Αυγούστου 2010 Δημοσ. 29 Αυγούστου 2010 Δοκίμασε το εξής: > if [ -r "$directory_name" ] then #check if directory not empty else echo "You do not have read permission" fi
firewalker Δημοσ. 29 Αυγούστου 2010 Δημοσ. 29 Αυγούστου 2010 Αυτό που σίγουρα μπορείς να δεις για έναν φάκελο που δεν έχεις read δικαιώματα είναι αν περιέχει άλλους φακέλου μέσα. Αυτό γίνεται με το πεδίο "Number of links" της εντολής ls -l. Είναι το δεύτερο πεδίο. drwx------ 4 root root 144 Aug 29 20:40 tst Αν είναι μεγαλύτερο του 2 (μην ξεχνάμε το . και ..) τότε σίγουρα έχει και άλλους καταλόγους μέσα. Για το αν υπάρχουν αρχεία μέσα, ή αν οι φάκελοι είναι άδειοι δεν γνωρίζω πως.
nikolasR200 Δημοσ. 30 Αυγούστου 2010 Μέλος Δημοσ. 30 Αυγούστου 2010 η ls εντολή φέρνει μήνυμα λάθους permission denied σε περίπτωση που δεν έχουμε το read δικαίωμα..αυτό που λέει ο φίλος firewalker δεν το γνωρίζω, αλλά οπωσδήποτε με νοιάζει έστω το αν υπάρχει αρχείο μέσα.. εγώ σκέφτηκα να κάνω απλά μια επιπλέον συνθήκη να προσπαθεί να τον διαγράψει έτσι και αλλιώς τον φάκελο και σε περίπτωση που είναι άδειος αυτό θα γίνεται με επιτυχια σε περίπτωση που δεν είναι άδειος βγάζει ούτως ή άλλως μήνυμα directory not empty οπότε απλά φορτώνομαι ένα επιπλέον μήνυμα λάθους που απλά ήθελα να αποφύγω..
Aztec Δημοσ. 30 Αυγούστου 2010 Δημοσ. 30 Αυγούστου 2010 η 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
nikolasR200 Δημοσ. 30 Αυγούστου 2010 Μέλος Δημοσ. 30 Αυγούστου 2010 Νομίζω ότι αυτο που παρέθεσες 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 διαβάζει ένα χαρακτήρα τη φορά δεν μου είναι αρκετό να καταλάβω τον ρόλο κάθε όρου στην εκτέλεση της συνθήκης..
gtroza Δημοσ. 31 Αυγούστου 2010 Δημοσ. 31 Αυγούστου 2010 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. η ανάστροφη "λοξή" δεν είναι χαρακτήρας διαφυγής, αλλά μέρος της γραμμής .
nikolasR200 Δημοσ. 31 Αυγούστου 2010 Μέλος Δημοσ. 31 Αυγούστου 2010 σ'ευχαριστώ πάρα πολύ ήταν ό,τι χρειαζόμουν..!!
gtroza Δημοσ. 1 Σεπτεμβρίου 2010 Δημοσ. 1 Σεπτεμβρίου 2010 σ'ευχαριστώ πάρα πολύ ήταν ό,τι χρειαζόμουν..!! στο Linux section ο κ apoikos βάζει δύσκολα θέματα και είμαστε συνέχεια με τις σημειώσεις πρόχειρες ! .
Προτεινόμενες αναρτήσεις
Αρχειοθετημένο
Αυτό το θέμα έχει αρχειοθετηθεί και είναι κλειστό για περαιτέρω απαντήσεις.