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
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
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
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
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.
ls --directory %F | sed 's/^/"/' | sed 's/$/"/' | awk '{print "script-convertir-video "$0" "}' | sh && zenity --info --text "Todas las conversiones han terminado"
FIN
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.
Die Wahrheit ist, dass Sie große Kenntnisse über Linux-Befehle haben. Sehr hilfreich!
Ja, ich weiß, wir werden hier viel mit ihm lernen, hahaha.
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.
o:
für i in $ (ls -d /path/a/folder/*.ext); BEFEHL "$ i"; getan;
Das sieht gut aus, aber wenn die Dateinamen Leerzeichen enthalten, funktioniert es nicht. 🙂
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.
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.
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.
Wenn Sie bemerken, dass das $ i in Anführungszeichen steht. Das macht das Entkommen von Leerzeichen unnötig.
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.
Sehr gut, komplex, aber sehr interessant.
das ist unglaublich, toll !!!!
Hervorragend, die Plastizität von GNU / Linux kennt keine Grenzen.
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