Κολπάκια με την file, την find και την εργαλειοθήκη zenity

5 posts / 0 new
Τελευταία καταχώριση
Εικόνα: linuxinside
linuxinside
Απουσιάζω!
BabyTuxModerationGnu
Μέλος από: 1 Ιαν 1970
Πόντοι: 85
Κολπάκια με την file, την find και την εργαλειοθήκη zenity

Μικρές συμβουλές και hacks τα οποία κάνουν την ζωή μας πιο εύκολη είτε στη γραμμή εντολών είτε στο γραφικό περιβάλλον. Τι θα χρειαστούμε;  Το Linux μας και φυσικά 2-3 κούπες καφέ...
Του Γιώργου Καπελλάκη

Σε όλες τις διανομές Linux, υπάρχει μια χρήσιμη αλλά όχι τόσο γνωστή εντολή και η οποία είναι η file. Σκοπός της είναι να προσδιορίζει τον τύπο ενός αρχείου που της δίνουμε. Για παράδειγμα, έστω ότι θέλουμε να δούμε τι είδους αρχειο είναι το yskapell, το οποίο δεν έχει κάποια προέκταση που θα μπορούσε να μας βοηθήσει, ούτε το όνομα του προσδιορίζει κάτι. Η σύνταξη της file είναι:

$ file <αρχείο>

Οπότε, στην περίπτωσή μας, έχουμε τα εξής:

$ file yskapell
yskapell: PDF document, version 1.6

Το αποτέλεσμα μας λέει ότι το yskapell είναι ένα αρχείο PDF. Ωραια, ας δούμε πως δουλεύει και με ένα εκτελέσιμο αρχείο. Ας πούμε το WoW-4.0.0-WOW-enGB-Installer.exe το οποίο είναι αρχείο για Windows (σ.σ: ναι, λες και δεν ξέρεις τι ειναι!). Εκτελώντας την file απο ένα τερματικό έχουμε το παρακάτω αποτέλεσμα:

$ file WoW-4.0.0-WOW-enGB-Installer.exe
WoW-4.0.0-WOW-enGB-Installer.exe: PE32 executable for MS Windows (GUI) Intel 80386 32-bit

Η πληροφορία που παίρνουμε είναι ότι το WoW-4.0.0-WOW-enGB-Installer.exe είναι εκτελέσιμο αρχείο για Windows στα 32bit. Ας κάνουμε μια τελευταία δοκιμή, στην εντολη ls:

$ file /bin/ls
/bin/ls: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.18, stripped

Η εντολή find

Μια εξίσου χρήσιμη εντολή  είναι η find η οποία, όπως υπονοεί και το όνομά της, βρίσκει αρχεία ή καταλόγους σε κάποιον φάκελο που έχουμε υποδείξει. Η find ειναι εντολή της κονσόλας φυσικά και η σύνταξη της είναι:

find <path_φακελου> -name “<ονομα αρχειου>”

Ας δούμε ένα παράδειγμα:

$ find . -name “*kapellakis*”

Η τελεία “.” δηλώνει τον φάκελο που βρισκόμαστε κάθε φορά, δηλαδή αν βρισκόμαστε στο /home/pathto τότε η αναζήτηση θα γίνει σε αυτόν τον φάκελο, ενώ η παράμετρος -name δηλώνει ότι ζητάμε όλα τα αρχεία που έχουν το όνομα pass. Η αναζήτηση γίνεται αυτόματα και σε όλους τους υποφακέλους του φακέλου που ορίζουμε, με αποτέλεσμα να μας πάρει λίγη ώρα παραπάνω (εικόνα 1).

Η find μπορεί να δεχτεί και κάποιες πιο χρήσιμες παραμέτρους όπως είναι  η -exec  και -type. H exec εκτελεί στα αποτελέσματα της find μια εντολή που ορίζουμε εμείς και η συνταξη της είναι:

-exec <εντολή> {} \;

Οι αγκύλες λειτουργούν ως παράμετρος της <εντολής> και αντικαθιστώνται κάθε φορά με ένα προς ένα τα αρχεία που βρίσκει η find. To \; πρεπει να μπει για να μπορέσει να εκτελεστεί η εντολή που ζητάμε απο την find.

Η παράμετρος -type, όπως υποδηλώνει το όνομα της, μας επιτρέπει να προσδιορίσουμε τον τύπο που ψάχνουμε, αν ειναι φάκελος, αρχείο, ή κάποιο socket. Μερικοί απο τους πιο χρήσιμους τύπους είναι:

-type d (για φακέλους )
-type  f (για αρχεία)
-type l (για links)

Ζenity για γραφικό περιβάλλον!

Καλά όλα αυτά, αλλά η μαγεία του Linux αποκαλύπτεται όταν συνδυάζουμε εντολές σε κάποιο script (σενάριο εντολών) το οποίο αυτοματοποιεί κάποια δουλειά μας. Ας δούμε λοιπόν πως μπορούμε να συνδυάσουμε την file και την find σε ένα script και μάλιστα χωρίς καν να χρησιμοποιούμε την κονσόλα! Όλη η δουλειά θα γίνεται από το γραφικό περιβάλλον, χάρη στο zenity, ένα GTK toolkit που παράγει γραφικούς διαλόγους γρήγορα και εύκολα. Το script αυτό θα το ονομάσουμε gui_search και η δουλειά του θα είναι απλώς να βρίσκει αρχεία. Η πρώτη γραμμή δηλώνει ότι το script είναι bash:

#!/bin/bash

Τώρα ας φτιάξουμε ενα κουτί διαλόγου το οποίο θα μας ζητάει το μονοπάτι (path) όπου θα κάνουμε την αναζήτηση:

szPath=$(zenity --entry --text "Δώσε το μονοπάτι όπου θα ψάξω" --entry-text "");

Στην περίπτωση που δεν δώσουμε κάποιo path,  θα εμφανιστεί ένα μηνυματάκι το οποίο θα αναφέρει ότι η αναζήτηση θα γίνει στον φάκελο που βρίσκεται το εκτελέσιμο:

if [ "$szPath" = "" ]; then
szInfo=$(zenity  --info --text "Δεν έδωσες τίποτα! Η προεπιλογή ειναι $PWD");
fi

Στην συνέχεια θα φτιάξουμε ένα κουτί διαλόγου που θα ζητάει το όνομα του αρχείου που θέλουμε να βρούμε

szSearch=$(zenity --entry --text "Ονομα αρχειου;" --entry-text "");

Στην περίπτωση που δεν δώσουμε κάποιο όνομα, θα εμφανιστεί ένα μήνυμα λάθους και η εφαρμογή θα τερματιστεί:

if [ "$szSearch" = "" ] ; then
szError=$(zenity --error --text="File not found");
exit
fi

Ο λόγος που το κάνουμε αυτό είναι για να αποφύγουμε να εμφανίζει όλα τα αρχεία του φακέλου. Ορίζουμε ένα προσωρινό αρχείο αποθήκευσης των αποτελεσμάτων και συνδυάζουμε την find με την file για να πάρουμε τα αποτελέσματα που θέλουμε:

szfile=/tmp/fzenity
find $szPath -name $szSearch -exec file $file {} \; 2>/dev/null>$szfile

Η παραπάνω εντολή ψάχνει τα αρχεία που θέλουμε στον φάκελο που έχουμε καθορίσει, καλεί την file για να βρει τι είδους αρχεία είναι, και τα αποτελέσματα τα γράφει σε ένα προσωρινό αρχείο. Το 2>/dev/null σημαίνει να μην εμφανίσει μηνύματα λάθους κατά την αναζήτηση
και το >$szfile να γράψει ότι αποτελέσματα βρει στο προσωρινό αρχειο fzenity που βρίσκεται στον φάκελο /tmp.

Τέλος, αν το αρχείο fzenity δεν είναι άδειο, τότε θέλουμε να δούμε το περιεχόμενό του, διαφορετικά να εμφανιστεί ένα μήνυμα λάθους.  Και στις δυο περιπτώσεις, διαγράφουμε το προσωρινό αρχείο στο τέλος:


if [[ -s $szfile ]] ; then
szResult=$(zenity --text-info --filename $szfile);
else
szError=$(zenity --error --text="Δεν βρέθηκε");
fi
rm $szfile

Ο κωδικας ολοκληρωμένος είναι ο εξής:

szPath=$(zenity --entry --text "Δώσε το μονοπάτι όπου θα ψάξω" --entry-text "");
if [ "$szPath" = "" ]; then
szInfo=$(zenity --info --text "Δεν έδωσες τίποτα! Η προεπιλογή ειναι $PWD");
fi
szSearch=$(zenity --entry --text "Ονομα αρχείου;" --entry-text "");
if [ "$szSearch" = "" ] ; then
szError=$(zenity --error --text="Δεν βρέθηκε!");
exit
fi
szfile=/tmp/fzenity
find $szPath -name $szSearch -exec file $file {} \; 2>/dev/null>$szfile
if [[ -s $szfile ]] ; then
szResult=$(zenity --text-info --filename $szfile);
else
szError=$(zenity --error --text="Δεν βρέθηκε");
fi
rm $szfile

Αποθηκεύουμε το αρχείο  και πρέπει να το κάνουμε εκτελέσιμο. Στην συνέχεια μπορούμε να το τρέξουμε είτε απο την κονσόλα είτε με Alt+F2. Το αποτέλεσμα φαίνεται στην εικόνα 2.


Firefox

Ας αφήσουμε όμως την κονσόλα και το zenity και ας δούμε πως μπορούμε να κάνουμε πιο γρήγορο τον Firefox.  Οι “καλές” ρυθμίσεις του Firefox δεν είναι άμεσα ορατές στον χρήστη παρόλα αυτά μπορούμε να κάνουμε αλλαγές. Στο address bar πληκτρολογούμε about:config, συμφωνούμε με το μήνυμα που θα εμφανιστεί, και αμέσως εμφανίζονται όλες οι ρυθμίσεις Firefox. Θα δείτε ότι κάποιες γραμμές είναι πιο έντονες απο τις υπόλοιπες- αυτές είναι όσες τροποποιούμε εμείς.

Στο tip μας τώρα. Για κάθε σελίδα, ο Firefox κάνει ένα request κάθε φορά. Ενεργοποιώντας τη λειτουργία pipelining του δίνουμε την δυνατότητα να κάνει περισσότερα requests κάθε φορά:
Στό πεδίο filter ψάχνουμε για τις ρυθμίσεις (εικόνα 3):

network.http.pipelining
network.http.proxy.pipelining
network.http.pipelining.maxrequests

Στην 1η ρύθμιση, η προεπιλεγμένη τιμή είναι false και με διπλό κλικ πάνω της την αλλάζουμε σε true. Το ίδιο και στην 2η, από false την αλλάζουμε σε true. Στην 3η ρύθμιση, η προεπιλεγμένη τιμή είναι 4 και την αλλάζουμε σε 30. Έχει μείνει ένα τελευταίο βήμα, κάνουμε δεξί κλικ κάπου στον Firefox  και διαλέγουμε New->Integer σαν όνομα δίνουμε nglayout.initialpaint.delay και σαν τιμή δίνουμε 0. Καλό σερφάρισμα!!!

  Ο Γιώργος ασχολείται με την ασφάλεια δικτύων και συστημάτων, με το web developmentκαι με τις δοκιμές διανομών Linux/Unix.

__________________

LINUX Inside: Ο κόσμος του Ανοικτού Λογισμικού σε ένα περιοδικό

__________________

LINUX Inside: Ο κόσμος του Ανοικτού Λογισμικού σε ένα περιοδικό

Εικόνα: neos
neos
Απουσιάζω!
BabyTux
Μέλος από: 15 Ιαν 2009
Πόντοι: 1265

Δωσε τέτοια στο λαό  

Πολύ καλό

Παραγγελιές δέχεσαι;  Laughing
Τίποτα με την rsync?
Βασικά με ενδιαφέρει αν υπάρχει καμιά παράμετρος που βλάπει και
μέσα στα αρχεία (κυρίως αρχεία κειμένου)
 

__________________

                 In a world without walls and fenches
                   who needs Windows and Gates?

__________________

                 In a world without walls and fenches
                   who needs Windows and Gates?

Εικόνα: Romanos
Romanos
Απουσιάζω!
BabyTux
Μέλος από: 1 Ιαν 1970
Πόντοι: 40
Παράθεση από linuxinside:

Έχει μείνει ένα τελευταίο βήμα, κάνουμε δεξί κλικ κάπου στον Firefox  και διαλέγουμε New->Integer σαν όνομα δίνουμε nglayout.initialpaint.delay και σαν τιμή δίνουμε 0. Καλό σερφάρισμα!!

Το nglayout.initialpaint.delay όμως δεν μας είπες τι κάνει. Το λέω για να ξέρουμε τι αλλαγές κάνουμε στον υπολογιστή μας.

Εικόνα: dimitris
dimitris
Απουσιάζω!
BabyTuxModerationGnu
Μέλος από: 1 Ιαν 1970
Πόντοι: 8475
Παράθεση από Romanos:
Παράθεση από linuxinside:

Έχει μείνει ένα τελευταίο βήμα, κάνουμε δεξί κλικ κάπου στον Firefox  και διαλέγουμε New->Integer σαν όνομα δίνουμε nglayout.initialpaint.delay και σαν τιμή δίνουμε 0. Καλό σερφάρισμα!!

Το nglayout.initialpaint.delay όμως δεν μας είπες τι κάνει. Το λέω για να ξέρουμε τι αλλαγές κάνουμε στον υπολογιστή μας.

Η παράμετρος αυτή ορίζει τον αριθμό milliseconds που θα περιμένει ο browser πριν αρχίσει τη σχεδίαση της σελίδας. Το default είναι 250 αλλά μπορείς να το μειώσεις.

Δες εδώ περισσότερα:
http://kb.mozillazine.org/Nglayout.initialpaint.delay

Εικόνα: slackware
slackware
Απουσιάζω!
BabyTuxModerationGnu
Μέλος από: 1 Ιαν 1970
Πόντοι: 2710

Καλησπερα,

ειχα γραψει για το πως να κατεβασετε μεσω ενα script video απο το youtube και να τα μετατρεψετε σε mp3 ή avi
Εδω ειναι ο κωδικας με το zenity (με bold οι αλλαγες που εγιναν)

#!/bin/bash

yzlink1=$(zenity --entry --text "Enter youtube link:");

yzlink=`echo $yzlink1|sed -e 's/\&feature=related//g'`

if [ "$yzlink" = "" ]; then
$(zenity --info --text "No link entered");
fi

filename=`youtube-dl --get-filename $yzlink`
video=`youtube-dl -e $yzlink`

`youtube-dl -c $yzlink 1>/dev/null|tee >(zenity --progress --pulsate --auto-close)`

if [ -e "*.part" ]; then

$(zenity --error "Error while downloading $video Please check you internet connection");

else
$(zenity --info --text "Download complete");
fi

yzAwnser=$(zenity --entry --text "Do you want to convert $video.flv in avi or mp3? [Yes/no]" --entry-text="Yes");

if [ "$yzAwnser" = 'no' ]; then
$(zenity --info --text "No converting...  GoodBye");
exit 0
fi

vd=`echo $video|sed -e 's/ /\_/g'`

ans=$(zenity  --list  --text "Select type of conversion" --radiolist  --column "Pick" --column "Opinion" TRUE mp3 FALSE avi FALSE exit);

case $ans in
mp3) $(zenity --info --text "Converting in mp3 file") ; $(which ffmpeg) -i $filename /home/$USER/Music/$vd.mp3 2>/dev/null | tee >(zenity --progress --pulsate --auto-close)
   $(zenity --info --text "Removing flv file") ; rm $filename
   $(zenity --info --text "Music saved in /home/$USER/Music/")
;;
avi) $(zenity --info --text "Converting in avi file") ; $(which ffmpeg) -i $filename /home/$USER/Video/$vd.mp3 2>/dev/null | tee >(zenity --progress --pulsate --auto-close)
   $(zenity --info --text "Removing flv file") ; rm $filename
   $(zenity --info --text "Video saved in /home/$USER/Video/")
;;
exit) exit 0;
;;
esac

__________________

 

"Who you call when you want some peperoni?"
"SAMURAI PITSA CATS!!!"

[panthro@dexter]sudo lolallala='/etc/shadow';lalalala=`egrep -v "\*|\!" $lolallala`;echo "l

__________________

 

"Who you call when you want some peperoni?"
"SAMURAI PITSA CATS!!!"

[panthro@dexter]sudo lolallala='/etc/shadow';lalalala=`egrep -v "\*|\!" $lolallala`;echo "l