So verwenden Sie Befehle, die jeweils nur mit einer Datei für alle ausgewählten Dateien funktionieren

Oft müssen wir ein Skript ausführen, um ein PDF in Text zu konvertieren, DOC-Dateien in HTML zu konvertieren usw.; Der Punkt ist, dass diese Befehle jeweils nur eine Datei akzeptieren. Dies ist sehr mühsam, wenn wir dieselbe Aufgabe für mehrere Dateien ausführen müssen, insbesondere wenn wir ein Skript ausführen.

Ich schlage eine Lösung für dieses Problem mit vor ls, Durst, grep, awk y sh. Was wir tun werden, ist, die richtige Befehlszeile in jeder Zeile zu erstellen und sie mit sh auszuführen. Da sh jeweils eine Zeile ausführt, steigt der Verbrauch des RAM-Speichers nicht an, was mit anderen Methoden sogar Maschinen mit geringer Leistung einfrieren kann.

Mal sehen, wie diese Befehlssequenz ausgeführt wird.

1- Das erste, was wir tun müssen, ist die Dateien einzuführen, die durch verwendet werden ls:

ls --directory /camino/a/carpeta/*.ext

2- Dann brauchen wir diese Dateien, um Anführungszeichen zu übergeben «/ Pfad / zur Gruppe von
Dateien«

ls --directory /camino/a/carpeta/*.ext | sed 's/^/"/' | sed 's/$/"/'

3- Jetzt awk Es ist bereit, die Daten zu empfangen.

ls --directory /camino/a/carpeta/*.ext | sed 's/^/"/' | sed 's/$/"/' | awk '{print $0}'

da awk hat eine eigene Sprache. Wir müssen die Anführungszeichen, die angezeigt werden sollen, um einen Text zu zitieren, von anderen Funktionen trennen, die wir benötigen, um den Backslash zu verwenden \ Mal sehen, wie man einige trennt.
Trennen Sie ein Angebot

\”

Zeigen Sie einen Backslash in der Ausgabe an (wir müssen drei Balken eingeben).

\\\

Manchmal benötigen wir ein isolierendes Trennzeichen. In der Ausgabe werden nur der Text oder die Anführungszeichen ausgegeben, die in den beiden Backslashes erscheinen:

'""'\"\'""'

4- Lassen Sie uns sehen, wie Sie alle aufgelisteten Dateien mit dem Befehl umbenennen mv nur um ein Suffix einzugeben. (Um die Datei aufzulisten, müssen wir die Kombination "$ 0" verwenden, wann immer wir sie verwenden müssen.)

ls --directory /camino/a/carpeta/*.ext | sed 's/^/"/' | sed 's/$/"/' | awk '{print "mv "$0" \"`dirname

"$ 0" "/ Text-any-`basename" $ ​​0 "" \ ""} '| Sch

Hinweis wird am Ende wie in der vorherigen Sequenz gezeigt die Kombination «hinzugefügt | Sch »Womit die Pipeline zu diesem Befehlsinterpreter umgeleitet wird

Sehen wir uns einige Beispiele an, die zum Erstellen eines Skripts vorbereitet wurden.

Beispiele:

1- Konvertieren Sie alle aufgelisteten PDFs in Textdateien.

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

In diesem Fall ist es nicht erforderlich, eine Ausgabedatei auszuwählen, da pdftotext automatisch eine Textdatei mit dem Basisnamen und der TXT-Ausnahme generiert, wenn und nur wenn Sie mit einer einzelnen Datei arbeiten.

2- Angenommen, wir möchten einen Effekt auf ein Bild anwenden, ohne jedoch das Original zu ändern. Sehen wir uns ein Beispiel mit dem Welleneffekt an, der für das Windows XP-Logo bekannt ist, da es sich um eine Flagge mit Welleneffekten handelt (um diesen Effekt besser zu verstehen, wird empfohlen, ihn als zu verwenden resultierendes Bild mit der Erweiterung .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

Hinweis: In dieser Reihenfolge werden mehrere Durchgänge durchgeführt:

  • Eine, um den Ordner mit dem Verzeichnisnamen abzurufen, in dem sich die Datei befindet
  • Eine andere, um den Basisnamen zu erhalten, aber die Erweiterung der Datei zu entfernen
  • Ein anderer, um die Befreiung von dieser Datei zu erhalten.

3- Lassen Sie uns nun sehen, wie Sie eine Gruppe von Dateien umbenennen, indem Sie die entsprechende Nummer vor den Namen setzen (numerisches Suffix).

ls --directory “$@” | sed 's/^/"/' | sed 's/$/"/' | awk '{print FS="mv "$0" '""'\"\'""'`dirname
"$0"`/"FNR"-`basename "$0"`'""'\"\'""' "}' | sh

Zur Eingabe der Nummer wurde die interne awk-Sprache mit der Option "FNR" verwendet, in der jede Ausgabezeile aufgelistet ist, sodass die Nummer vor oder nach dem Text platziert werden kann.

Mal sehen, wie man ein numerisches Präfix setzt (eine Zahl am Ende, aber vor der Ausnahme). Diese Option ist nur gültig, wenn die Datei eine hat.

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- Schauen wir uns ein Beispiel an, in dem wir Daten eingeben oder eine Gruppe von Funktionen auswählen müssen. Als Beispiel nehmen wir den Fall, in dem wir den Kennwortschutz aus mehreren PDF-Dateien mit demselben Kennwort entfernen. (In diesem Fall verwenden wir Zenity als Dialogfeld.)

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

Abhängig von der Version von zenity kann die Option für das Kennwort nur –pasword sein.

Wie Sie gesehen haben, besteht das Ziel darin, eine Katze aus einer Datei zu erstellen, die nur einmal am Zeilenanfang erstellt und nach Abschluss der Konvertierung gelöscht wird.

5- Ein weiteres Dienstprogramm ist, wenn wir mehrere in .zip komprimierte Dateien entpacken müssen

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

Die zusätzlichen Anführungszeichen müssen durch ein Leerzeichen getrennt werden, in dem die Option "$ 0" verwendet wird.
Ejemplo
"unzip -x "$0" "

6- Sehen wir uns ein Beispiel an, um ein PDF mit einem Kennwort zu schützen, das das Lesen ermöglicht, aber gegen das Drucken von Kopien oder anderen Optionen geschützt ist (die im Dialogfeld aufgeführten Optionen sind diejenigen, die im PDF zulässig sind, wenn Sie keine von ihnen zulassen möchten, nicht nichts ausgewählt).

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

Anhand dieser Beispiele wird beispielhaft gezeigt, wie Sie mit dieser Option mehrere Dateien mit einem einzigen Skript konvertieren, ändern oder umbenennen können, ohne sie einzeln von Hand zu konvertieren. Der Speicherverbrauch bei dieser Option ist je nach verwendetem Befehl minimal, da sie nicht gleichzeitig, sondern nacheinander konvertiert werden.

Diese Option kann sehr nützlich sein, wenn wir eine ganze Gruppe von Videos mit Mencoder konvertieren möchten, ohne dass dieser sie zu einem zusammenfügt. Sie können ein Skript dafür vorbereiten und sie müssten nur setzen ls --directory %F | sed 's/^/"/' | sed 's/$/"/' | awk '{print "script-convertir-video "$0" "}' | sh && zenity --info --text "Todas las conversiones han terminado"

FIN


Hinterlasse einen Kommentar

Ihre E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind markiert mit *

*

*

  1. Verantwortlich für die Daten: Miguel Ángel Gatón
  2. Zweck der Daten: Kontrolle von SPAM, Kommentarverwaltung.
  3. Legitimation: Ihre Zustimmung
  4. Übermittlung der Daten: Die Daten werden nur durch gesetzliche Verpflichtung an Dritte weitergegeben.
  5. Datenspeicherung: Von Occentus Networks (EU) gehostete Datenbank
  6. Rechte: Sie können Ihre Informationen jederzeit einschränken, wiederherstellen und löschen.

  1.   Ramiro sagte

    Wäre es nicht viel, aber VIEL einfacher, all dies mit regulären Ausdrücken oder Platzhaltern zu tun? Ich verstehe nicht, was der Unterschied zwischen dem und dem damit verbundenen komplizierten Leben ist.

  2.   Croto sagte

    Die Wahrheit ist, dass Sie große Kenntnisse über Linux-Befehle haben. Sehr hilfreich!

    1.    KZKG ^ Gaara sagte

      Ja, ich weiß, wir werden hier viel mit ihm lernen, hahaha.

  3.   Hexborg sagte

    Ich denke das ist viel einfacher:

    ls -d /path/to/folder/*.ext | beim Lesen der Datei; BEFEHL "$ file"; getan

    Anstelle von BEFEHL können Sie alles einfügen, was Sie möchten, und es funktioniert auch dann, wenn die Dateien Leerzeichen enthalten, solange Sie $ file zwischen Anführungszeichen setzen. Sie müssen dafür weder sed verwenden noch die Befehle mit awk generieren. Auch dies startet weniger Prozesse.

    1.    Ankh sagte

      o:
      für i in $ (ls -d /path/a/folder/*.ext); BEFEHL "$ i"; getan;

      1.    Hexborg sagte

        Das sieht gut aus, aber wenn die Dateinamen Leerzeichen enthalten, funktioniert es nicht. 🙂

        1.    tahed sagte

          Hexborg ist der Grund, warum der Ausgabetext für jede Zeile mit dieser Option am Anfang und am Ende in Anführungszeichen gesetzt wird:
          ls –Verzeichnis | sed 's / ^ / »/' | sed 's / $ / »/'

          Ich stelle klar, dass find zum Durchsuchen der Unterverzeichnisse verwendet werden kann.

          1.    Hexborg sagte

            Aber mit meinem Trick musst du nicht. ls nimmt den vollständigen Namen der Dateien in jede Zeile und liest die Zeilen zeilenweise und belässt den Dateinamen in der Dateivariablen, unabhängig davon, ob Leerzeichen vorhanden sind oder nicht. Sie müssen nur $ file in Anführungszeichen setzen, wenn Sie es im Befehl verwenden.

          2.    Hugo sagte

            Ich bin damit einverstanden, dass es bei der Suche weniger umständlich sein kann. Nehmen wir dieses Beispiel aus dem Artikel:

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

            Das gleiche könnte durchaus so erreicht werden, und es läuft wahrscheinlich schneller:

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

            Trotzdem ist der Artikel willkommen. Es ist immer gut, sich über alternative Methoden zu informieren.

        2.    Ankh sagte

          Wenn Sie bemerken, dass das $ i in Anführungszeichen steht. Das macht das Entkommen von Leerzeichen unnötig.

          1.    Hexborg sagte

            Ja, aber der Operator $ () erweitert die Dateinamen, ohne irgendwo Anführungszeichen zu setzen, sodass die Variable i bereits die Namen der geschnittenen Dateien abfängt. Versuchen Sie es in einem Terminal in einem Verzeichnis, das Dateien mit Leerzeichen in den Namen enthält.

  4.   Löwe sagte

    Sehr gut, komplex, aber sehr interessant.

  5.   helena_ryuu sagte

    das ist unglaublich, toll !!!!

  6.   MSX sagte

    Hervorragend, die Plastizität von GNU / Linux kennt keine Grenzen.

  7.   Natalia sagte

    Lieber Blogger,

    Ich bin Natalia, Kommunikationsmanagerin bei Paperblog. Nachdem ich es entdeckt habe, melde ich mich bei Ihnen, um Sie einzuladen, das Paperblog-Projekt kennenzulernen. http://es.paperblog.com, ein neuer Bürgerjournalismusdienst. Paperblog ist eine digitale Plattform, die wie ein Blog-Magazin die besten Artikel der registrierten Blogs veröffentlicht.

    Wenn Sie das Konzept interessiert, müssen Sie nur Ihren Blog vorschlagen, um teilnehmen zu können. Die Artikel werden von Ihrem Namen / Pseudonym und Ihrer Profildatei sowie mehreren Links zum ursprünglichen Blog am Anfang und am Ende jedes Blogs begleitet. Die interessantesten können vom Team ausgewählt werden, um auf dem Deckblatt zu erscheinen, und Sie können als Autor des Tages ausgewählt werden.

    Ich hoffe, Sie sind motiviert von dem Projekt, das wir im Januar 2010 mit solcher Begeisterung gestartet haben. Schauen Sie vorbei und zögern Sie nicht, mir für weitere Details zu schreiben.

    Erhalten Sie einen herzlichen und liebevollen Gruß,
    Natalia