Τρόπος χρήσης εντολών που λειτουργούν μόνο με ένα αρχείο κάθε φορά με όλα τα αρχεία που επιλέγετε

Πολλές φορές πρέπει να εκτελέσουμε ένα σενάριο για να μετατρέψουμε ένα 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

Σε αυτήν την περίπτωση δεν είναι απαραίτητο να επιλέξετε ένα αρχείο εξόδου, καθώς το pdftotext δημιουργεί αυτόματα ένα αρχείο κειμένου με το όνομα βάσης και την εξαίρεση .txt εάν και μόνο εάν εργάζεστε με ένα μόνο αρχείο.

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

Για να εισαγάγετε τον αριθμό, χρησιμοποιήθηκε η εσωτερική γλώσσα awk με την επιλογή "FNR" που παραθέτει κάθε γραμμή εξόδου, οπότε ο αριθμός μπορεί να τοποθετηθεί πριν ή μετά το κείμενο.

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

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

Ανάλογα με την έκδοση του zenity, η επιλογή για τον κωδικό πρόσβασης μπορεί να είναι απλώς –pasword.

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

5- Ένα άλλο βοηθητικό πρόγραμμα είναι, όταν πρέπει να αποσυμπιέσουμε πολλά αρχεία συμπιεσμένα στο .zip

ls --directory “$@” | sed 's/^/"/' | sed 's/$/"/' | awk '{print "unzip -x "$0" "}' | sh

Τα επιπλέον εισαγωγικά πρέπει να διαχωρίζονται από ένα διάστημα όπου χρησιμοποιείται η επιλογή "$ 0".
Παράδειγμα
"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

Με αυτά τα παραδείγματα είναι αρκετά παραδειγματικό πώς να χρησιμοποιήσετε αυτήν την επιλογή για να μετατρέψετε, να τροποποιήσετε ή να μετονομάσετε πολλά αρχεία με ένα σενάριο και να μην τα μετατρέψετε με το χέρι ένα προς ένα. Η κατανάλωση μνήμης με αυτήν την επιλογή είναι ελάχιστη, ανάλογα με την εντολή που χρησιμοποιείται, καθώς δεν τις μετατρέπει ταυτόχρονα αλλά τη μία μετά την άλλη.

Αυτή η επιλογή μπορεί να είναι πολύ χρήσιμη αν θέλουμε να μετατρέψουμε μια ολόκληρη ομάδα βίντεο με mencoder χωρίς αυτό να τα συνδέσει σε ένα. μπορείτε να ετοιμάσετε ένα σενάριο για αυτό και θα πρέπει απλώς να το βάλουν ls --directory %F | sed 's/^/"/' | sed 's/$/"/' | awk '{print "script-convertir-video "$0" "}' | sh && zenity --info --text "Todas las conversiones han terminado"

FIN


Αφήστε το σχόλιό σας

Η διεύθυνση email σας δεν θα δημοσιευθεί. Τα υποχρεωτικά πεδία σημειώνονται με *

*

*

  1. Υπεύθυνος για τα δεδομένα: Miguel Ángel Gatón
  2. Σκοπός των δεδομένων: Έλεγχος SPAM, διαχείριση σχολίων.
  3. Νομιμοποίηση: Η συγκατάθεσή σας
  4. Κοινοποίηση των δεδομένων: Τα δεδομένα δεν θα κοινοποιούνται σε τρίτους, εκτός από νομική υποχρέωση.
  5. Αποθήκευση δεδομένων: Βάση δεδομένων που φιλοξενείται από τα δίκτυα Occentus (ΕΕ)
  6. Δικαιώματα: Ανά πάσα στιγμή μπορείτε να περιορίσετε, να ανακτήσετε και να διαγράψετε τις πληροφορίες σας.

  1.   Ramiro dijo

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

  2.   κρότο dijo

    Η αλήθεια, έχει μεγάλη γνώση των εντολών linux. Πολύ χρήσιμο!

    1.    KZKG ^ Γκάρα dijo

      Ναι, ξέρω ότι θα μάθουμε πολλά μαζί του εδώ χαχαχα.

  3.   hexborg dijo

    Νομίζω ότι αυτό είναι πολύ πιο εύκολο:

    ls -d /path/to/folder/*.ext | ενώ διαβάζετε το αρχείο. κάντε εντολή "$ file"; Έγινε

    Αντί να κάνετε εντολή, μπορείτε να βάλετε ό, τι θέλετε και λειτουργεί ακόμα κι αν τα αρχεία περιέχουν κενά διαστήματα, αρκεί να τοποθετείτε $ $ ανάμεσα σε εισαγωγικά. Δεν χρειάζεται να χρησιμοποιήσετε sed για αυτό ή να δημιουργήσετε τις εντολές με awk. Επίσης ξεκινά λιγότερες διαδικασίες.

    1.    Ankh dijo

      o:
      για i στο $ (ls -d /path/to/folder/*.ext); ΔΕΙΤΕ το "$ i"; Έγινε;

      1.    hexborg dijo

        Αυτό φαίνεται καλό, αλλά αν τα ονόματα των αρχείων περιέχουν κενά, δεν λειτουργεί. 🙂

        1.    έκανα dijo

          Στην πραγματικότητα, το hexborg είναι ο λόγος για τον οποίο το κείμενο εξόδου αναφέρεται στην αρχή και στο τέλος για κάθε γραμμή με αυτήν την επιλογή:
          ls –κατάλογος | sed 's / ^ / »/' | sed 's / $ / »/'

          Διευκρινίζω ότι η εύρεση μπορεί να χρησιμοποιηθεί για την αναζήτηση των υποκαταλόγων.

          1.    hexborg dijo

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

          2.    Hugo dijo

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

            ls --directory “$@” | sed 's/^/"/' | sed 's/$/"/' | awk '{print "pdftotext",$0}' | sh

            Το ίδιο θα μπορούσε να επιτευχθεί έτσι, και μάλλον τρέχει πιο γρήγορα:

            find . -type f -print0 | xargs -0 pdftotext

            Τούτου λεχθέντος, το άρθρο είναι ευπρόσδεκτο, είναι πάντα καλό να μαθαίνετε για εναλλακτικούς τρόπους να κάνετε κάτι.

        2.    Ankh dijo

          Εάν παρατηρήσετε το $ i είναι σε εισαγωγικά. Αυτό καθιστά περιττή τη διαφυγή στο κενό.

          1.    hexborg dijo

            Ναι, αλλά ο τελεστής $ () επεκτείνει τα ονόματα των αρχείων χωρίς να τοποθετεί εισαγωγικά οπουδήποτε, έτσι η μεταβλητή εγώ ήδη πιάνει τα ονόματα των κομμένων αρχείων. Δοκιμάστε το σε ένα τερματικό σε έναν κατάλογο που έχει αρχεία με κενά στα ονόματα.

  4.   Λέων dijo

    Πολύ καλό, περίπλοκο, αλλά πολύ ενδιαφέρον.

  5.   helena_ryuu dijo

    αυτό είναι καταπληκτικό, υπέροχο !!!!

  6.   MSX dijo

    Εξαιρετικά, η πλαστικότητα του GNU / Linux δεν έχει όρια.

  7.   Ναταλία dijo

    Αγαπητέ blogger,

    Είμαι η Ναταλία, Διευθυντής Επικοινωνιών στο Paperblog. Αφού το ανακάλυψα, έρχομαι σε επαφή μαζί σας για να σας προσκαλέσω να μάθετε το έργο Paperblog, http://es.paperblog.com, μια νέα υπηρεσία δημοσιογραφίας πολιτών. Το Paperblog είναι μια ψηφιακή πλατφόρμα που, όπως και ένα περιοδικό blog, δημοσιεύει τα καλύτερα άρθρα των καταχωρημένων ιστολογίων.

    Εάν η ιδέα σας ενδιαφέρει, πρέπει μόνο να προτείνετε το ιστολόγιό σας για συμμετοχή. Τα άρθρα θα συνοδεύονταν από το όνομα / ψευδώνυμο και το αρχείο προφίλ σας, καθώς και από διάφορους συνδέσμους προς το αρχικό ιστολόγιο, στην αρχή και στο τέλος του καθενός. Τα πιο ενδιαφέροντα μπορούν να επιλεγούν από την ομάδα για να εμφανιστούν στην Εξώφυλλο και μπορείτε να επιλέξετε ως Συγγραφέας της ημέρας.

    Ελπίζω να έχετε κίνητρα από το έργο που ξεκινήσαμε με τόσο ενθουσιασμό τον Ιανουάριο του 2010. Ρίξτε μια ματιά και μην διστάσετε να μου γράψετε για περισσότερες λεπτομέρειες.

    Λάβετε έναν εγκάρδιο και στοργικό χαιρετισμό,
    Ναταλία