Μάθε να φτιάχνεις μικρά script - Αν εσύ δεν ξέρεις κάτι, θα το ξέρει το internet

Αν πάψεις να φοβάσαι είναι εύκολο να χρησιμοποιήσεις το bash για να κάνεις πολύπλοκα πράγματα. Δεν θέλεις να ξέρεις προγραμματισμό ούτε να διαβάσεις βιβλία και το manual του bash. Οχι πως δεν βοηθούν, αλλά στην πραγματικότητα θέλεις 2 πράγματα: Καλή γνώση αγγλικών και να ξέρεις να κάνεις ερωτήσεις στο google.

Το πρόβλημα

Βρήκα ένα ωραίο σετ με εικόνες για δίσκους εδώ που μου άρεσαν για να τα χρησιμοποιήσω κάπως έτσι. Προς απογοήτευση μου μετά από το κατέβασμα αντί να βρω ωραία εικονίδια, μετά την αποσυμπίεση βρήκα μια σειρά από αρχεία ico, τα οποία δεν έκαναν καν προ επισκόπηση. Ώρα να δούμε τι συμβαίνει. Ανοίγω ένα από αυτά στο gimp για να βρω το παρακάτω:

image

Υπάρχουν πολλές στρώσεις,και κάθε μια περιέχει την εικόνα σε διαφορετικές διαστάσεις. Η στρώση #9 περιέχει την εικόνα καθαρή. Οι διαστάσεις είναι 256x256. Αρκεί να κάνω τις υπόλοιπες στρώσεις μη ορατές και να αποθηκεύσω ως .png. Και αυτό ήταν, αλλά τα κλικ πολλά και οι εικόνες πολλές, θέλω κάποιο τρόπο αυτοματισμού…

Μια εικόνα μόνο πρώτα

Ώρα για το πρώτο ερώτημα στο google linux convert ico layer κάτι που οδήγησε σε αυτή την σελίδα. Ήταν σε μένα το δεύτερο αποτέλεσμα, χρησιμοποιεί το imagemagick που το έχω ήδη και το ξέρω, οπότε θα πάω με αυτό. Έχει σαν παράδειγμα χρήσης το

convert image.ico[4] -thumbnail 64x64 -flatten image.png

άρα για να κάνω μια δοκιμή

  convert sata_good.ico[9] -thumbnail 256x256 -flatten sata_good.png

και διαπιστώνω πως κάτι έκανε, αλλά βρε βλάκα η αρίθμηση στους υπολογιστές ξεκινάει απο το 0 άρα η σωστή εντολή είναι

  convert "sata_good.ico[8]" -thumbnail 256x256 -flatten sata_good.png

Αν θέλω κάτι μικρότερο, για να δοκιμάσω το παρακάτω να δω αν δουλεύει

  convert "sata_good.ico[8]" -thumbnail 64x64 -flatten sata_good_64.png

Ωραία, δουλεύουν τα παντα σωστά. Το έβαλα μέσα σε εισαγωγικά γιατί το κέλυφος μου είναι το zsh. Αλλά μιας και θα γράψω στο bash δεν με πειράζει και το ξεχνάω.

Πολλές εικόνες όλες μαζί

Θα φτιάξω ένα αρχείο στον κατάλογο με τις εικόνες και θα το κάνω εκτελέσιμο.

touch convert.sh
chmod +x convert.sh

Θα ανοίξω τον αρχείο με κάποιο διορθωτή και θα γράψω μέσα τα παρακάτω

#!/bin/bash
echo "The script is running"

Γράφοντας τώρα

 ./convert.sh

θα τρέξει και θα δείξει το μύνημα. Έχω κάνει ήδη μια καλή αρχή.

Στην συνέχεια, αυτό μπορείς να το ξέρεις ήδη, αλλά δεν πειράζει. Πες πως δεν το ξέρεις. Πως θα κάνω την ίδια εντολή σε όλα τα αρχεία ενός καταλόγου; Ώρα για το δεύτερο ερώτημα στο google: bash all files current directory κάτι που με πάει εδώ καθώς και δεκάδες άλλες σελίδες.

Άρα η βάση για να ξεκινήσω είναι αυτή

#!/bin/bash
for f in *.ico
do
	echo "Processing ico file : $f"
done

Δοκιμάζω και τρέχει μια χαρά :blush:

Τώρα θέλω να κάνω το αρχείο με sata_good.ico σαν sata_good-64.png ή σαν sata_good-32.png με λίγη σκέψη ίσως να έβγαζα πρώτα την επέκταση του αρχείου; Ώρα για το επόμενο ερώτημα στο google bash remove file extension και διαβάζω αυτό. Πολλοί τρόποι, αλλά επιλέγω ένα απλό, και ιδού

#!/bin/bash
for f in *.ico
do
    base="${f%.*}"	
    echo "Processing ico file : $f, basename is $base"
done

Με μια δοκιμή, όλα βαίνουν καλώς. Για να δούμε το επόμενο βήμα

#!/bin/bash
for f in *.ico
do
    base="${f%.*}"	
    file64="$base-64.png"
    echo "Processing ico file : $f -> $file64"
done

Έχουμε με την βοήθεια λίγων ερωτημάτων στο google ότι θέλουμε. Ας γίνουμε λίγο τολμηροί

#!/bin/bash
for f in *.ico
do
    base="${f%.*}"	
    file64="$base-64.png"
    echo "Processing ico file : $f -> $file64"
    convert "$f[8]" -thumbnail 64x64 -flatten "$file64"
done

και ναι δούλεψε !!!

Οι παρατηρητικοί πρόσεξαν πως τελικά έβαλα το αρχείο σε εισαγωγικά. Αυτό το έκανα για να καλύψω την περίπτωση που το αρχείο περιέχει κάποιο κενό στο όνομα του. Στην συγκεκριμένη περίπτωση δεν ήταν απαραίτητο, αλλά δεν βλάπτει.

Συμπέρασμα

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

Ξέρω υπάρχουν πολλά που δεν καταλαβαίνεις, αλλά με λίγη διαίσθηση (και ίσως και λίγο διάβασμα) θα τα καταλάβεις. Το μόνο που θέλει είναι να το ξεπάρεις καθώς και μια αίσθηση περιπέτειας :slight_smile:

Αν φτιάξεις κάτι που σου είναι χρήσιμο, μοιράσου το εδώ, όσο απλό και να είναι, Θα βοηθήσεις με το παράδειγμα σου άλλους να κάνουν το ίδιο. Και αν είσαι τυχερός άλλοι χρήστες θα σου δώσουν της λύσεις τους, που μπορεί να είναι λίγο καλύτερες.

Ναι αλλά δεν ξέρω αγγλικά

Τε τα πράγματα είναι ποιο δύσκολα, αλλά μπορείς να ρωτήσεις είτε εδώ είτε κάπου άλλου. Αλλά το μυστικό είναι να κάνεις την σωστή ερώτηση.

Πως να ρωτήσω και να πάρω βοήθεια έξυπνα;

Αν ρωτήσεις για το αρχικό πρόβλημα, ή δώσεις 100 γραμμές που έχεις γράψει και ρωτήσεις τι δεν δουλεύει, κανένας δεν θα μπει στον κόπο να ασχοληθεί. Αν όμως κάνεις την σωστή ερώτηση “Πως μπορώ να τρέξω μια εντολή σε όλα τα αρχεία ενός καταλόγου”, “πως μπορώ να αλλάξω κατάληξη στο όνομα ενός αρχείου” ή “πως αφαιρώ την επέκταση απο το όνομα ενός αρχείου”, τότε θα πάρεις καλές απαντήσεις, και μπορεί να έχεις και πολλές για να διαλέξεις.

Και αυτό είναι το μυστικό πάντα όταν ρωτάς κάτι σε μια κοινότητα.

13 «Μου αρέσει»

Προσωπικά, κάπως έτσι έμαθα να φτιάχνω shell scripts. Για να μη χρειάζεται να γράφω συνέχεια πολλές εντολές με πολλά arguments. Από ένα μικρό script για να διορθώσω ένα πρόβλημα με κάποια πακέτα στο Ubuntu μέχρι το script για το line in input το οποίο το ανέβασα στο github αλλά και διάφορα άλλα τα οποία έχω γράψει.

Δεν είναι κάποιος power user εάν δε γράφει τα δικά του scripts (για όποιο λειτουργικό σύστημα χρησιμοποιεί) :wink:

1 «Μου αρέσει»