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

slackware | Πέμ, 08/18/2011 - 22:26 | 12' | 4

Μικρές συμβουλές και 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 (G UI) 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.
 

Φόρουμ
Δώσε αστέρια!

MO: (ψήφοι: 0)

Σχόλια

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

Πολύ καλό

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

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

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

Romanos]

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

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

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

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

Καλησπερα,

ειχα γραψει για το πως να κατεβασετε μεσω ενα 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