Πολλές φορές πρέπει να εκτελέσουμε ένα σενάριο για να μετατρέψουμε ένα pdf σε κείμενο, να μετατρέψουμε αρχεία .doc σε html, κλπ. Το θέμα είναι ότι αυτές οι εντολές δέχονται μόνο ένα αρχείο τη φορά και αυτό είναι πολύ κουραστικό εάν πρέπει να εκτελέσουμε την ίδια εργασία σε πολλά αρχεία, ειδικά όταν κάνουμε ένα σενάριο.
Προτείνω μια λύση για αυτό το πρόβλημα χρησιμοποιώντας ls, δίψα, grep, awk y sh. Αυτό που θα κάνουμε είναι να δημιουργήσουμε τη σωστή γραμμή εντολών σε κάθε σειρά και να τις εκτελέσουμε με sh, και αφού το sh θα εκτελεί μία γραμμή τη φορά, η κατανάλωση μνήμης ram δεν θα αυξηθεί, η οποία με άλλες μεθόδους μπορεί ακόμη και να παγώσει μηχανές με χαμηλή ισχύ.
Ας δούμε πώς να εκτελέσουμε αυτήν την ακολουθία εντολών.
1- Το πρώτο πράγμα που πρέπει να κάνουμε είναι να εισαγάγουμε τα αρχεία που θα χρησιμοποιηθούν ls:
ls --directory /camino/a/carpeta/*.ext
2- Τότε θα χρειαζόμαστε αυτά τα αρχεία για να περάσουμε εισαγωγικά «/ διαδρομή / στην ομάδα του
αρχεία«
ls --directory /camino/a/carpeta/*.ext | sed 's/^/"/' | sed 's/$/"/'
3- Τώρα awk θα είναι έτοιμο να λάβει τα δεδομένα.
ls --directory /camino/a/carpeta/*.ext | sed 's/^/"/' | sed 's/$/"/' | awk '{print $0}'
Επειδή awk έχει τη δική του γλώσσα, θα πρέπει να διαχωρίσουμε τα αποσπάσματα που θέλουμε να εμφανίσουμε για να παραθέσουμε ένα κείμενο μεταξύ άλλων λειτουργιών που θα χρειαστεί να χρησιμοποιήσουμε την ανάστροφη κάθετο \ Ας δούμε πώς να διαχωρίσουμε μερικά.
Διαχωρίστε ένα απόσπασμα
\”
Εμφανίστε μια ανάστροφη κάθετο στην έξοδο (θα χρειαστεί να πληκτρολογήσετε τρεις γραμμές)
\\\
Μερικές φορές χρειαζόμαστε ένα διαχωριστικό απομόνωσης, μόνο το κείμενο ή τα εισαγωγικά που εμφανίζονται στις δύο ανάστροφες κάθετες θα εξάγονται στην έξοδο:
'""'\"\'""'
4- Ας δούμε πώς να μετονομάσουμε όλα τα αρχεία που παρατίθενται χρησιμοποιώντας την εντολή mv απλώς για να εισαγάγετε ένα επίθημα. (Τώρα για να απαριθμήσουμε το αρχείο θα χρειαστεί να χρησιμοποιήσουμε τον συνδυασμό "$ 0" όποτε χρειαστεί να το χρησιμοποιήσουμε)
ls --directory /camino/a/carpeta/*.ext | sed 's/^/"/' | sed 's/$/"/' | awk '{print "mv "$0" \"`dirname
"$ 0 ″" / Text-any-`basename "$ 0 ″" \ ""} '| SH
Η σημείωση προστίθεται στο τέλος όπως φαίνεται στην προηγούμενη ακολουθία ο συνδυασμός « | SH »Που ανακατευθύνει τον αγωγό σε αυτόν τον διερμηνέα εντολών
Ας δούμε μερικά παραδείγματα που προετοιμάστηκαν για τη δημιουργία ενός σεναρίου.
Παραδείγματα:
1- Μετατρέψτε όλα τα pdf που παρατίθενται σε αρχεία κειμένου.
ls --directory “$@” | sed 's/^/"/' | sed 's/$/"/' | awk '{print "pdftotext",$0}' | sh
2- Ας πούμε ότι θέλουμε να εφαρμόσουμε ένα εφέ σε μια εικόνα, αλλά χωρίς να τροποποιήσουμε το πρωτότυπο, ας δούμε ένα παράδειγμα με το εφέ κύματος γνωστό για το λογότυπο των Windows XP, καθώς είναι μια σημαία με κυματιστά εφέ (για να εκτιμήσουμε καλύτερα αυτό το εφέ, συνιστάται να χρησιμοποιείται ως εικόνα που προκύπτει με την επέκταση .png).
ls --directory “$@” | sed 's/^/"/' | sed 's/$/"/' | awk '{print FS="convert -wave 25x150
"$0"","\"\`dirname "$0"`/`basename "$0" | sed '"'"s/\\\\.[[:alnum:]]*$//"'"'`-wave.`basename "$0" |
rev | awk -F . \'"'"'\{print $1}\'"'"'\ | rev`'""'\"\'""' "}' | sh
Σημείωση: γίνονται πολλά περάσματα με αυτήν την ακολουθία:
- Ένας για να πάρετε το φάκελο όπου βρίσκεται το αρχείο με το όνομα
- Ένα άλλο για να αποκτήσετε το όνομα βάσης, αλλά αφαιρώντας την επέκταση του εν λόγω αρχείου
- Ένα άλλο για να λάβετε την εξαίρεση του εν λόγω αρχείου.
3- Ας δούμε τώρα πώς να μετονομάσουμε μια ομάδα αρχείων τοποθετώντας τον αντίστοιχο αριθμό μπροστά από το όνομα (αριθμητικό επίθημα).
ls --directory “$@” | sed 's/^/"/' | sed 's/$/"/' | awk '{print FS="mv "$0" '""'\"\'""'`dirname
"$0"`/"FNR"-`basename "$0"`'""'\"\'""' "}' | sh
Ας δούμε πώς να βάλετε ένα αριθμητικό πρόθεμα (βάλτε έναν αριθμό στο τέλος, αλλά πριν από την εξαίρεση) αυτή η επιλογή ισχύει μόνο εάν το αρχείο έχει ένα.
ls --directory “$@” | sed 's/^/"/' | sed 's/$/"/' | awk '{print FS="mv "$0" \"`dirname
"$0"`/`basename "$0" | sed '\'s/\\\\.[[:alnum:]]*$//\''`-"FNR".`echo "$0" | rev | awk -F .
'""'\'\'""'{print $1}'""'\'\'""' | rev `\" " }' | sh
4- Ας δούμε ένα παράδειγμα όπου θα πρέπει να εισαγάγουμε δεδομένα ή να επιλέξουμε μια ομάδα συναρτήσεων, λαμβάνοντας ως παράδειγμα την περίπτωση κατάργησης της προστασίας κωδικού πρόσβασης από πολλά αρχεία pdf που έχουν τον ίδιο κωδικό πρόσβασης. (Σε αυτήν την περίπτωση θα χρησιμοποιήσουμε το zenity ως παράθυρο διαλόγου)
zenity --entry --hide-text --text "introduzca la clave de desbloqueo" > $HOME/.cat && ls
--directory “$@” | sed 's/^/"/' | sed 's/$/"/' | awk '{print FS="pdftk "$0" input_pw `cat
$HOME/.cat` output \"`dirname "$0"`/`basename "$0" .pdf`-unlock.pdf\" "}' | sh && rm
$HOME/.cat
Όπως είδατε, ο στόχος είναι να δημιουργήσετε μια γάτα ενός αρχείου που θα δημιουργηθεί στην αρχή της γραμμής μόνο μία φορά και στη συνέχεια θα διαγραφεί μόλις ολοκληρωθεί η μετατροπή.
5- Ένα άλλο βοηθητικό πρόγραμμα είναι, όταν πρέπει να αποσυμπιέσουμε πολλά αρχεία συμπιεσμένα στο .zip
ls --directory “$@” | sed 's/^/"/' | sed 's/$/"/' | awk '{print "unzip -x "$0" "}' | sh
Παράδειγμα
"unzip -x "$0" "
6- Ας δούμε ένα παράδειγμα για την προστασία ενός pdf με κωδικό πρόσβασης, επιτρέποντας την ανάγνωση αλλά προστατεύεται από την εκτύπωση αντιγράφου ή άλλων επιλογών, (οι επιλογές που παρατίθενται στο παράθυρο διαλόγου θα είναι αυτές που θα επιτρέπονται στο pdf, εάν δεν θέλετε να επιτρέψετε καμία από αυτές, μην επιλέξτε κανένα).
zenity --separator " " --multiple --text "Seleccione los Opciones que quiere permitir" --column "Opciones" --list "Printing" "DegradedPrinting" "ModifyContents" "CopyContents" "ScreenReaders" "ModifyAnnotations" "AllFeatures" > $HOME/.cat && zenity --entry --hidetext --text "Teclee la contraseña de protección" > $HOME/.cat2 && ls --directory "$@" | sed 's/^/"/' | sed 's/$/"/' | awk '{print FS="echo \"pdftk \\\"`echo "$0"`\\\" output \\\"`dirname "$0"`/`basename "$0" .pdf`-locked.pdf\\\" allow `cat $HOME/.cat` owner_pw \"`cat $HOME/.cat2`\"\" | sh "}' | sh && rm $HOME/.cat $HOME/.cat2
Με αυτά τα παραδείγματα είναι αρκετά παραδειγματικό πώς να χρησιμοποιήσετε αυτήν την επιλογή για να μετατρέψετε, να τροποποιήσετε ή να μετονομάσετε πολλά αρχεία με ένα σενάριο και να μην τα μετατρέψετε με το χέρι ένα προς ένα. Η κατανάλωση μνήμης με αυτήν την επιλογή είναι ελάχιστη, ανάλογα με την εντολή που χρησιμοποιείται, καθώς δεν τις μετατρέπει ταυτόχρονα αλλά τη μία μετά την άλλη.
ls --directory %F | sed 's/^/"/' | sed 's/$/"/' | awk '{print "script-convertir-video "$0" "}' | sh && zenity --info --text "Todas las conversiones han terminado"
FIN
Δεν θα ήταν πολύ, αλλά πολύ πιο εύκολο να το κάνεις όλα αυτά χρησιμοποιώντας κανονικές εκφράσεις ή μπαλαντέρ; Δεν καταλαβαίνω ποια είναι η διαφορά μεταξύ αυτού και να κάνεις τη ζωή σου τόσο περίπλοκη με αυτό.
Η αλήθεια, έχει μεγάλη γνώση των εντολών linux. Πολύ χρήσιμο!
Ναι, ξέρω ότι θα μάθουμε πολλά μαζί του εδώ χαχαχα.
Νομίζω ότι αυτό είναι πολύ πιο εύκολο:
ls -d /path/to/folder/*.ext | ενώ διαβάζετε το αρχείο. κάντε εντολή "$ file"; Έγινε
Αντί να κάνετε εντολή, μπορείτε να βάλετε ό, τι θέλετε και λειτουργεί ακόμα κι αν τα αρχεία περιέχουν κενά διαστήματα, αρκεί να τοποθετείτε $ $ ανάμεσα σε εισαγωγικά. Δεν χρειάζεται να χρησιμοποιήσετε sed για αυτό ή να δημιουργήσετε τις εντολές με awk. Επίσης ξεκινά λιγότερες διαδικασίες.
o:
για i στο $ (ls -d /path/to/folder/*.ext); ΔΕΙΤΕ το "$ i"; Έγινε;
Αυτό φαίνεται καλό, αλλά αν τα ονόματα των αρχείων περιέχουν κενά, δεν λειτουργεί. 🙂
Στην πραγματικότητα, το hexborg είναι ο λόγος για τον οποίο το κείμενο εξόδου αναφέρεται στην αρχή και στο τέλος για κάθε γραμμή με αυτήν την επιλογή:
ls –κατάλογος | sed 's / ^ / »/' | sed 's / $ / »/'
Διευκρινίζω ότι η εύρεση μπορεί να χρησιμοποιηθεί για την αναζήτηση των υποκαταλόγων.
Αλλά με το κόλπο μου δεν χρειάζεται. Παίρνει τα πλήρη ονόματα των αρχείων ένα σε κάθε γραμμή και διαβάζει ανάγνωση ανά γραμμή και αφήνει το όνομα του αρχείου στη μεταβλητή αρχείου είτε έχει κενά κενά είτε όχι. Απλώς πρέπει να βάλετε εισαγωγικά γύρω από το αρχείο $ όταν το χρησιμοποιείτε στην εντολή.
Συμφωνώ ότι στο εύρημα μπορεί να είναι λιγότερο δυσκίνητο. Ας πάρουμε αυτό το παράδειγμα από το άρθρο:
ls --directory “$@” | sed 's/^/"/' | sed 's/$/"/' | awk '{print "pdftotext",$0}' | sh
Το ίδιο θα μπορούσε να επιτευχθεί έτσι, και μάλλον τρέχει πιο γρήγορα:
find . -type f -print0 | xargs -0 pdftotext
Τούτου λεχθέντος, το άρθρο είναι ευπρόσδεκτο, είναι πάντα καλό να μαθαίνετε για εναλλακτικούς τρόπους να κάνετε κάτι.
Εάν παρατηρήσετε το $ i είναι σε εισαγωγικά. Αυτό καθιστά περιττή τη διαφυγή στο κενό.
Ναι, αλλά ο τελεστής $ () επεκτείνει τα ονόματα των αρχείων χωρίς να τοποθετεί εισαγωγικά οπουδήποτε, έτσι η μεταβλητή εγώ ήδη πιάνει τα ονόματα των κομμένων αρχείων. Δοκιμάστε το σε ένα τερματικό σε έναν κατάλογο που έχει αρχεία με κενά στα ονόματα.
Πολύ καλό, περίπλοκο, αλλά πολύ ενδιαφέρον.
αυτό είναι καταπληκτικό, υπέροχο !!!!
Εξαιρετικά, η πλαστικότητα του GNU / Linux δεν έχει όρια.
Αγαπητέ blogger,
Είμαι η Ναταλία, Διευθυντής Επικοινωνιών στο Paperblog. Αφού το ανακάλυψα, έρχομαι σε επαφή μαζί σας για να σας προσκαλέσω να μάθετε το έργο Paperblog, http://es.paperblog.com, μια νέα υπηρεσία δημοσιογραφίας πολιτών. Το Paperblog είναι μια ψηφιακή πλατφόρμα που, όπως και ένα περιοδικό blog, δημοσιεύει τα καλύτερα άρθρα των καταχωρημένων ιστολογίων.
Εάν η ιδέα σας ενδιαφέρει, πρέπει μόνο να προτείνετε το ιστολόγιό σας για συμμετοχή. Τα άρθρα θα συνοδεύονταν από το όνομα / ψευδώνυμο και το αρχείο προφίλ σας, καθώς και από διάφορους συνδέσμους προς το αρχικό ιστολόγιο, στην αρχή και στο τέλος του καθενός. Τα πιο ενδιαφέροντα μπορούν να επιλεγούν από την ομάδα για να εμφανιστούν στην Εξώφυλλο και μπορείτε να επιλέξετε ως Συγγραφέας της ημέρας.
Ελπίζω να έχετε κίνητρα από το έργο που ξεκινήσαμε με τόσο ενθουσιασμό τον Ιανουάριο του 2010. Ρίξτε μια ματιά και μην διστάσετε να μου γράψετε για περισσότερες λεπτομέρειες.
Λάβετε έναν εγκάρδιο και στοργικό χαιρετισμό,
Ναταλία