Βοήθεια με "καλλωπισμό" bash script

...του ubuntu και έργων ΕΛ/ΛΑΚ (Έργα-Οδηγοί-Προτάσεις)

Συντονιστής: konnn

Βοήθεια με "καλλωπισμό" bash script

Δημοσίευσηαπό jennie » 26 Νοέμ 2011, 14:43

Θέλω να συμμαζέψω λίγο αυτό το σκριπτ:
Κώδικας: Επιλογή όλων
find -name "*.dsl.dz" | while read i; do dictunzip "$i"; done && find -name "*.dsl" | while read i; do iconv "$i" -f UTF-16 -t UTF-8 -o "$i".bak; done && find -name "*.bak" | while read i; do sed -i '/^[ \t\#]/!s/\(.*\)/\1\n\|\1/g' "$i"; done && find -name "*.bak" | while read i; do sed -i -e '/^|/s/[αάάᾳἀἅἄἁὰἂἃἄᾄᾇᾆᾷᾅᾶᾴᾁᾆᾷἇᾄᾴᾁᾀἅᾀᾳᾅἃἂἆᾶὰἁἀἇἆ]/a/g' -e '/^|/s/β/b/g' "$i"; done && find -name "*.bak" | while read i; do sed -i 's/^|//g' "$i"; done && find -name "*.bak" | while read i; do sed -i '$!N; /^\(.*\)\n\1$/!P; D' "$i"; done && find -name "*.bak" | while read i; do iconv "$i" -f UTF-8 -t UTF-16 -o "${i/.bak}"; done && find -name "*.bak" | while read i; do rm "$i"; done && find -name "*.dsl" | while read i; do dictzip "$i"; done;
Συγκεκριμένα:
1. Προφανώς θα μπορούσα να είχα χρησιμοποιήσει σωληνώσεις, αλλά πώς;
2. Τελικά, στο sed, το [αάΆΑ] είναι το ίδιο με το να γράψεις κάθε γράμμα ξεχωριστά (από άποψη ταχύτητας εννοώ);
3. Προαιρετικά: Πώς θα έπρεπε να μετατρέψω το σκριπτ, ώστε να διαβάζει ποιες ευρέσεις/αντικαταστάσεις πρέπει να γίνουν από ένα tab delimited αρχείο;
π.χ.
Κώδικας: Επιλογή όλων
[αάάᾳἀἅἄἁὰἂἃἄᾄᾇᾆᾷᾅᾶᾴᾁᾆᾷἇᾄᾴᾁᾀἅᾀᾳᾅἃἂἆᾶὰἁἀἇἆ]/a
[ΑΆΆᾎᾍᾌᾉᾌᾉἊᾺἉᾈᾼᾺἊἋἈἉἌᾏᾎᾍἍἋἌᾼἏἎᾉᾈᾼᾌᾍᾈἈᾌᾏᾼἏἎἍᾏᾉᾎᾍᾎ]/A
β/b
Β/B
γ/g
Γ/G
δ/d
Δ/D
[εέέἔἓἒὲἑἐἑἕὲἒἓἕἔ]/e
[ΕΈΈἛἘἙῈἘἚῈἝἜἙἝἜἛἚ]/E
ζ/z
Ζ/Z
[ηήήἧῆἦῆἥᾖᾐἧῇὴἤἥἡἣἠἢῃᾑᾔᾗἢὴἡἠἣἤᾕᾖᾗῄᾑᾐῃῇῄᾔᾕ]/h
[ΗΉΉᾙᾘᾟῌᾜἬἫἪᾘᾞᾘᾝᾟᾞῌᾟᾞᾝᾙᾜᾝἭἮἯἮᾙᾞῌᾝῌᾘᾙᾜᾟἭἨἩῊἯἩῊἬἨἫἪ]/H
θ/q
Θ/Q
[ιίίϊΐἱἰἲἰἵἴὶἱἳἲἷἴἵἶῖἶἳῖἷ]/i
[ΙΊΊΪἾἿἸἹῚἺἿἼἽἻἹἸῚἼἽἺἻἾ]/I
κ/k
Κ/K
λ/l
Λ/L
μ/m
Μ/M
ν/n
Ν/N
ξ/c
Ξ/C
[οόόὅὀὁὸὃὄὂὄὂὃὀὅὁὸ]/o
[ΟΌΌὉὈὋὌὍῸὊῸὉὈὊὌὋ]/O
π/p
Π/P
[ρῤ]/r
[ΡῬ]/R
[σς]/s
Σ/S
τ/t
Τ/T
[υύύϋΰὗὑὐὑὔὓὒὓὺὔὕὐὺὖὗὖῦὒῦ]/u
[ΥΎΎΫὛῪὙὝῪὟὝὛὟ]/U
φ/f
Φ/F
χ/x
Χ/X
ψ/y
Ψ/Y
[ωώώᾠᾡᾦὥῶὦὧῳῷᾥὢὼὡὠὣὤῴᾤᾧᾦῷᾥᾤῴὡὠᾡὼὢὣὧὦὤῶᾠὥῳ]/w
[ΩΏΏᾯᾮᾭᾬᾩᾨῼὯὮὨὩῺᾬᾭὫὭὬὪὭὮὯὫὪᾯῺὩὨῼᾨᾮᾩᾬᾭᾯᾮᾩᾨῼᾯᾮῼᾭᾬᾨᾩ]/W/g'
1 Γνώσεις Linux: Μέτριες ┃ Προγραμματισμού: Ελάχιστες ┃ Αγγλικών: Εξαιρετικές
2 Ubuntu 12.04 LTS σε όλους τους υπολογιστές της οικογένειάς μου
Άβαταρ μέλους
jennie
dudeTUX
dudeTUX
 
Δημοσιεύσεις: 495
Εγγραφή: 24 Δεκ 2008, 13:57
Εκτύπωση

Re: Βοήθεια με "καλλωπισμό" bash script

Δημοσίευσηαπό simosx » 26 Νοέμ 2011, 16:09

Κώδικας: Επιλογή όλων
#!/bin/bash

find -name "*.dsl.dz" | while read i; do dictunzip "$i"; done
find -name "*.dsl" | while read i; do iconv "$i" -f UTF-16 -t UTF-8 -o "$i".bak; done
find -name "*.bak" | while read i; do sed -i '/^[ \t\#]/!s/\(.*\)/\1\n\|\1/g' "$i"; done
find -name "*.bak" | while read i; do sed -i -e '/^|/s/[αάάᾳἀἅἄἁὰἂἃἄᾄᾇᾆᾷᾅᾶᾴᾁᾆᾷἇᾄᾴᾁᾀἅᾀᾳᾅἃἂἆᾶὰἁἀἇἆ]/a/g' -e '/^|/s/β/b/g' "$i"; done
find -name "*.bak" | while read i; do sed -i 's/^|//g' "$i"; done
find -name "*.bak" | while read i; do sed -i '$!N; /^\(.*\)\n\1$/!P; D' "$i"; done
find -name "*.bak" | while read i; do iconv "$i" -f UTF-8 -t UTF-16 -o "${i/.bak}"; done
find -name "*.bak" | while read i; do rm "$i"; done
find -name "*.dsl" | while read i; do dictzip "$i"; done;


Ένα πρώτο βήμα θα ήταν να γραφτεί όπως παραπάνω.
Η διαφορά με το αρχικό σου είναι ότι όταν αποτύχει μια από τις εντολές, τότε οι επόμενες εντολές δεν εκτελούνται.
Με την παραπάνω απλή εκδοχή όλες οι εντολές εκτελούνται. Θα μπορούσα να διαβάζω την τιμή εξόδου της προηγούμενης εντολής και με if να επιτρέπω να συνεχίσει ή όχι.
Αυτό το κάνεις με το να ελέγχεις τη μεταβλητή $?, όπου έχει τιμή 0 αν η προηγούμενη εντολή εκτελέστηκε με επιτυχία, διαφορετικά υπήρξε πρόβλημα.

Με το '|' χρησιμοποιείς ήδη σωληνώσεις (pipes).

Μια βελτίωση θα ήταν να καταγράφεις το αποτέλεσμα της `find -name "*.bak"` σε μια μεταβλητή, ώστε να το επαναχρησιμοποιείς.
Π.χ.
Κώδικας: Επιλογή όλων

files_bak=`find -name "*.bak"`
echo $files_back | while.......
echo $files_back | while.......
echo $files_back | while.......
προσωπικό ιστολόγιο ϗ πλανήτης Ubuntu-gr
Συμβάλετε και εσείς στο ελληνικό βιβλίο Ubuntu!
1 Γνώσεις Linux: Πολύ καλό ┃ Προγραμματισμού: Πολύ καλό ┃ Αγγλικών: Πολύ καλό
2 Ubuntu 13.10 saucy 3.11.0-031100rc1-generic 64bit (el_GR.UTF-8, Unity ubuntu)
3 AMD E-450 APU with Radeon HD Graphics ‖ RAM 3555 MiB ‖ Sony Corporation VAIO
4 AMD nee ATI Wrestler [Radeon HD 6320] [1002:9806] {fglrx_pci}
5 eth0: Atheros Inc. AR8151 v2.0 Gigabit Ethernet [1969:1083] (rev c0) ⋮ wlan0: Atheros Inc. AR9285 [168c:002b] (rev 01)
Φτιάξτε και εσείς τη δική σας υπογραφή (παραπάνω κείμενο) αυτόματα με κλικ εδώ!
simosx
Επίτιμο μέλος
Επίτιμο μέλος
 
Δημοσιεύσεις: 10334
Εγγραφή: 11 Μάιος 2008, 18:52
Launchpad: simosx
IRC: simosx
Εκτύπωση

Re: Βοήθεια με "καλλωπισμό" bash script

Δημοσίευσηαπό jennie » 27 Νοέμ 2011, 09:47

Ευχαριστώ, αλλά για να το θέσω λίγο θεωρητικά:
Κώδικας: Επιλογή όλων
find -name "*.bak" | while read i; do ΕΝΤΟΛΗ1; done
find -name "*.bak" | while read i; do ΕΝΤΟΛΗ2; done

Ο παραπάνω κώδικας βρίσκει όλα τα αρχεία με επέκταση .bak και εκτελεί την ΕΝΤΟΛΗ1. Μετά, ξαναβρίσκει όλα τα αρχεία .bak και εκτελεί την εντολή2.
Μπορώ να γράψω κώδικα που να βρίσκει όλα τα αρχεία με επέκταση .bak, να εκτελεί την εντολή1 και μετά να εκτελεί την εντολή2 στο αποτέλεσμα;
1 Γνώσεις Linux: Μέτριες ┃ Προγραμματισμού: Ελάχιστες ┃ Αγγλικών: Εξαιρετικές
2 Ubuntu 12.04 LTS σε όλους τους υπολογιστές της οικογένειάς μου
Άβαταρ μέλους
jennie
dudeTUX
dudeTUX
 
Δημοσιεύσεις: 495
Εγγραφή: 24 Δεκ 2008, 13:57
Εκτύπωση

Re: Βοήθεια με "καλλωπισμό" bash script

Δημοσίευσηαπό simosx » 27 Νοέμ 2011, 19:29

jennie έγραψε:Ευχαριστώ, αλλά για να το θέσω λίγο θεωρητικά:
Κώδικας: Επιλογή όλων
find -name "*.bak" | while read i; do ΕΝΤΟΛΗ1; done
find -name "*.bak" | while read i; do ΕΝΤΟΛΗ2; done

Ο παραπάνω κώδικας βρίσκει όλα τα αρχεία με επέκταση .bak και εκτελεί την ΕΝΤΟΛΗ1. Μετά, ξαναβρίσκει όλα τα αρχεία .bak και εκτελεί την εντολή2.
Μπορώ να γράψω κώδικα που να βρίσκει όλα τα αρχεία με επέκταση .bak, να εκτελεί την εντολή1 και μετά να εκτελεί την εντολή2 στο αποτέλεσμα;


Ναι, μπορείς να γράψεις ως
Κώδικας: Επιλογή όλων

#!/bin/bash
for i in $( find -name "*.bak" ); do
ΕΝΤΟΛΗ1
ΕΝΤΟΛΗ2
done


Εδώ εκτελούμε ενα βρόχο for(), όπου έχει ως ορίσματα το αποτέλεσμα της εντολής find. Κάθε φορά που τρέχει ο βρόχος, το $i εμπεριέχει ένα όνομα αρχείου από τα *.bak.
Οι εντολές ΕΝΤΟΛΗ1, ΕΝΤΟΛΗ2, κτλ έχουν πρόσβαση στο όνομα του αρχείου μέσω της μεταβλητής $i.

Δες περισσότερα για βρόχους (loops) στο
http://tldp.org/HOWTO/Bash-Prog-Intro-HOWTO-7.html
προσωπικό ιστολόγιο ϗ πλανήτης Ubuntu-gr
Συμβάλετε και εσείς στο ελληνικό βιβλίο Ubuntu!
1 Γνώσεις Linux: Πολύ καλό ┃ Προγραμματισμού: Πολύ καλό ┃ Αγγλικών: Πολύ καλό
2 Ubuntu 13.10 saucy 3.11.0-031100rc1-generic 64bit (el_GR.UTF-8, Unity ubuntu)
3 AMD E-450 APU with Radeon HD Graphics ‖ RAM 3555 MiB ‖ Sony Corporation VAIO
4 AMD nee ATI Wrestler [Radeon HD 6320] [1002:9806] {fglrx_pci}
5 eth0: Atheros Inc. AR8151 v2.0 Gigabit Ethernet [1969:1083] (rev c0) ⋮ wlan0: Atheros Inc. AR9285 [168c:002b] (rev 01)
Φτιάξτε και εσείς τη δική σας υπογραφή (παραπάνω κείμενο) αυτόματα με κλικ εδώ!
simosx
Επίτιμο μέλος
Επίτιμο μέλος
 
Δημοσιεύσεις: 10334
Εγγραφή: 11 Μάιος 2008, 18:52
Launchpad: simosx
IRC: simosx
Εκτύπωση

Re: Βοήθεια με "καλλωπισμό" bash script

Δημοσίευσηαπό jennie » 28 Νοέμ 2011, 01:45

Ευχαριστώ!
1 Γνώσεις Linux: Μέτριες ┃ Προγραμματισμού: Ελάχιστες ┃ Αγγλικών: Εξαιρετικές
2 Ubuntu 12.04 LTS σε όλους τους υπολογιστές της οικογένειάς μου
Άβαταρ μέλους
jennie
dudeTUX
dudeTUX
 
Δημοσιεύσεις: 495
Εγγραφή: 24 Δεκ 2008, 13:57
Εκτύπωση


Επιστροφή στο Ανάπτυξη Λογισμικού / Αλγόριθμοι