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

shell programming


voulaji

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

Ψάχνω για scripts που θα υλοποιούν τα πιο κάτω:

 

1.να εκτυπώνει μια λίστα μόνο με τα directories (όχι files) που βρίσκονται στο τρέχον directory (όχι στα subdirectories).

2.να εκτυπώνει μια λίστα μόνο με τα files (όχι directories) τα οποία είναι μεγαλύτερα από 10Kb και βρίσκονται στο τρέχον directory (και στα subdirectories).

3.να τυπώνει στην οθόνη τις γραμμές ενός αρχείου με τυχαίο σειρά

 

Υπάρχει καμιά ιδέα?

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

1. Εκτυπώνει στην οθόνη όλα τα directory αλλά νομίζω όχι τα sub-directory

>find /path/to/directory -type d -maxdepth 1

 

2. Εκτυπώνει στην οθόνη όλα τα αρχεία που είναι μεγαλύτερα από 10kb από όλα τα sub-directory

>find /path/to/directory -type f -size +10k

3. Δεν γνωρίζω

 

Δεν είναι δοκιμασμένες οι εντολές.

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Καταρχήν ευχαριστώ πολύ τον macabre_sunsets για την βοήθειά του.

Όσο για τα υπόλοιπα σχόλια, δεν νομίζω οτι υπάρει μάθημα στο κόσμο που να περνιέται με 2-3 scripts!!!!!!!!

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

:-)

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Για το πρώτο έχω κανει αυτό:

 

#!/bin/bash

 

echo "printing directory names..."

ls -ap | grep "/"

 

if [ $? -ne 0 ]

then

echo "exiting abnormally..."

fi

 

Δουλεύει μια χαρά, οπότε δεν νομίζω να είναι κάτι λάθος?

 

Τώρα για τα υπόλοιπα δυο, ειλικρινά δεν μπορώ να φτιάξω κάτι σωστό.

 

---------- Προσθήκη στις 22:58 ---------- Προηγούμενο μήνυμα στις 22:51 ----------

 

Φίλε macabre_sunsets, προσπαθώ να δοκιμάσω την δική σου εκδοχή για την 2, αλλά δεν ...δουλεύει.

 

2. Εκτυπώνει στην οθόνη όλα τα αρχεία που είναι μεγαλύτερα από 10kb από όλα τα sub-directory

>find /path/to/directory -type f -size +10k

 

Έχεις καμιά ιδέα για το πώς μπορεί να διαφοροποιηθεί?

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

[/color]Φίλε macabre_sunsets, προσπαθώ να δοκιμάσω την δική σου εκδοχή για την 2, αλλά δεν ...δουλεύει.

 

2. Εκτυπώνει στην οθόνη όλα τα αρχεία που είναι μεγαλύτερα από 10kb από όλα τα sub-directory

>find /path/to/directory -type f -size +10k

 

Έχεις καμιά ιδέα για το πώς μπορεί να διαφοροποιηθεί?

 

Μελέτησε το παρακάτω.

 

http://unixhelp.ed.ac.uk/CGI/man-cgi?find

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Καταρχήν συμφωνούμε ολοι ότι το πρώτο είναι σωστο?

Ή μήπως υπάρχει πιο εύκολη λύση, όπως αυτη που προτείνει ο macabre_sunsets?

 

Για το δεύτερο, μπορώ να πώ ότι η πρόταση του macabre_sunsets με βρίσκει σύμφωνη αλλά νομίζω πως σαν λύση θα πρέπει να είναι κατι πιο κομψό.

 

Σε ότι αφορά το τρίτο, δεν έχω καμια άποψη γιατί μου φαίνεται πολύ δύσκολο.

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Το πρώτο εγώ θα το έκανα:

 

>
#!/bin/bash

ls -d -1 */

 

ή

 

>
#!/bin/bash

ls -l |grep "^d"

 

 

Όλα τα παραπάνω έχουν πάνω από μία λύσεις. Το θέμα είναι πως θέλεις να υλοποιήσεις κάτι. Αν έχεις περιορισμούς σε κάτι. Μπορεί για παράδειγμα να σου έλεγαν τύπωσε όλα τα αρχεία και όχι καταλόγους κάνοντας χρήση μόνο των built-in εντολών του bash.

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Επανέρχομαι δριμυτερη.........

1->

Οι γενικές παρατηρησεις που έχουμε, ειναι:

α) Είναι υποχρεωτική η χρήση του bash ως shell

β) κάθε script θα πρέπει να είναι ευανάγνωστο (π.χ. σωστή ονοματολογία, στοίχιση) και ξεκάθαρο στη σχεδίαση (όχι περίεργη σύνταξη/εντολές, σχολιασμός μόνο όταν είναι απολύτως απαραίτητο).

 

2->

Φίλε firewalker, αν υιοθετήσω τον δικό σου τρόπο, θα πρέπει να βγάλω το if?

Ή τέλος πάντων, πώς θα είναι στην τελική του μορφή αυτό που εσύ προτείνεις?

 

 

3->

Σε ότι αφορά το 3, εχω κάνει κατι, με βασικες εντολές τις πιο κατω:

...

if [ $# -gt 1 ] ;

...

if [ "$?" = "1" ] ;

...

if [ -s $1 -a -r $1 ] ;

Δεν το έχω ολοκληρώσει όμως.

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Εγώ για παράδειγμα στον εντοπισμό αρχείων θα έκανα το παρακάτω.

 

>
#!/bin/bash

for FILE in *; do
       if [ -f $FILE ]; then
               echo $FILE
       fi
done

 

 

Για τα directories αντίστοιχα:

 

>
#!/bin/bash

for FILE in *; do
       if [ -d $FILE ]; then
               echo $FILE
       fi
done

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Φίλε firewalker σε ευχαριστώ (όπως και όλους τους άλλους) για τη συμμετοχή, αλλά νομίζω ότι με μπέρδεωψες περισσότερο.

Καταρχήν, οι δυο κώδικες που έγραψες είναι για το πρώτο ζήτημα?

Δεύτερον, οι γενικοί περιορισμοί είναι σεβαστοί σε αυτο το κώδικα ?

Τρίτον, για το ζήτημα με τα 10 Κb, υπάρχει καμιά ιδέα?

Έχω μπλοκάρει σε αυτό κ δε μπορώ να σκεφτώ κάτι.

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Λοιπόν...

 

Για το 1:

 

>
#!/bin/bash

for FILE in *; do #Βρόχος for για την εύρεση όλων των περιεχομένων.

       if [ -d $FILE ]; then     #Έλεγχος για τον εντοπισμό φακέλου.
               echo $FILE        #Αν ο παραπάνω έλεγχος είναι αληθής τύπωσε το όνομα του φακέλου.
       fi

done

exit 0

 

Για το 2:

 

>
#!/bin/bash

for FILE in *; do #Βρόχος for για την εύρεση όλων των περιεχομένων

       if [ -f $FILE ]; then #Έλεγχος για τον εντοπισμό αρχείων.

               file_size=$(stat -c %s $FILE)         #Υπολογισμός του μεγέθους με την εντολή stat(1).
               if [ "$file_size" -gt 10240 ]; then   #Έλεγχος αν το μέγεθος του αρχείου είναι μεγαλύτερο από 10k.
                       echo $FILE                    #Aν ο έλεγχος είναι αληθής τύπωσε το όνομα του αρχείου.
               fi
       fi

done

exit 0

 

Εντολή stat(1).

 

 

Για το 3:

 

>
#!/bin/bash

echo "Δώσε το όνομα του αρχείου"
read file_name

echo "Τύπωμα των σειρών με τυχαία σειρά:"
echo

shuf $filename

exit 0

 

Εντολή shuf(1).

 

Στο 3 μπορείς να υλοποιήσεις και κάποιον έλεγχο για την ύπαρξη του αρχείου. Επίσης θα μπορούσες να το κάνεις να παίρνει το όνομα του αρχείου σαν όρισμα.

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

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

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

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