Gibt es einen Grund, warum Sie versuchen, dies in einem einzeiligen Befehl zu tun? Es ist so kompliziert, dass es einfacher ist, es als kleines Shell-Skript zu verwalten. Wenn Sie jedoch einen Einzeiler möchten, finden Sie hier ein Beispiel, das im Grunde eine Bash-Schleife ist, die pdfgrep aufruft, basierend auf Ihrem Beispiel:
while read line; do file=$(echo $line|awk -F: '{print $1}');printf "$file: "; echo "$line"|grep -q :0$ && echo no match && continue;echo MATCH;mv -i "$file" DESTINATION/;done < <(find TARGET/ -type f -iname '*.pdf' -exec pdfgrep -Hc -m 1 "DESIRE STRING" {} \;)
Beachten Sie, dass pdfgrep die Option "-c" verwendet, um festzustellen, ob der Text in der PDF-Datei enthalten ist. Es verwendet die Option "-m 1", um nach dem ersten Match anzuhalten, sollte also theoretisch bei großen Dateien schneller laufen.
Wenn Ihr pdfgrep die Option "-m 1" nicht unterstützt, lassen Sie dieses Bit aus.
Und zur leichteren Lesbarkeit hier der Code, wie er in einem Bash-Skript erscheinen könnte:
#!/bin/bash
while read line; do
file=$(echo $line|awk -F: '{print $1}')
printf "$file: "
echo "$line"|grep -q :0$ && echo no match && continue
echo MATCH
mv -i "$file" DESTINATION/
done < <(find TARGET/ -type f -iname '*.pdf' -exec pdfgrep -Hc "DESIRE STRING" {} \;)
Codeerklärung Zeile für Zeile:
Dies ist der Befehlszeileninterpreter. Wenn das Skript ausführbar wäre (Sie können es mit dem Befehl "chmod + x mv-pdf-files.sh" ausführbar machen), könnten Sie es wie "./mv-pdf-files.sh" ausführen und es würde / bin verwenden / bash, um das Skript auszuführen.
Dies ist eine Bash While-Schleife. Es durchläuft jede Ausgabezeile, die vom Befehl ganz am Ende des Skripts generiert wird (der Befehl "find").
Dadurch wird der Dateiname aus der Ausgabezeile abgerufen und in einer Variablen (mit dem Namen "Datei") gespeichert.
Hiermit wird der Dateiname in der Standardausgabe ohne eine neue Zeile am Ende ausgegeben.
Dieser grep-Befehl sucht am Ende der Zeile nach ": 0". Dies zeigt an, dass in dieser PDF-Datei keine Übereinstimmungen mit dem STRING gefunden wurden. Die Befehle && sind miteinander verkettet. Wenn also keine Übereinstimmung gefunden wird, wird der Echo-Befehl ausgeführt, und anschließend wird eine Bash "continue" aufgerufen, die zur nächsten Datei in der Schleife springt (dh zur Codezeile 3 zurückkehrt).
Dies zeigt nur, dass eine Übereinstimmung gefunden wurde.
Dies ist der eigentliche mv-Befehl, genau wie in Ihrem Code.
Das "Fertig" kennzeichnet das Ende der while-Schleife. Der Befehl "find" in der <<() - Notation ist das, worüber die while-Schleife iteriert. Der Befehl find findet einfach alle Dateien im angegebenen Pfad (TARGET /), die mit .pdf enden (ohne Berücksichtigung der Groß- und Kleinschreibung). Der Parameter -exec weist find an, den Befehl "pdfgrep" für jede Datei auszuführen, wobei -H zum Drucken des Dateinamens und "-c" zum Drucken der Anzahl der Übereinstimmungen des in der PDF-Datei gefundenen STRING verwendet wird. Die {} Zeichen am Ende werden intern von "find" verwendet, um den Dateinamen als Variable darzustellen.