Verschieben von PDF mit String und Drucken ok oder nicht bei jeder Dateisuche gefunden

-1

Ich verwende den folgenden Befehl mit pdf, um nach bestimmten Zeichenfolgen in mehreren PDFs zu suchen und nach einem Zielverzeichnis zu suchen, wenn eine Übereinstimmung vorliegt:

pdfgrep -H "DESIRE STRING" TARGET/* | grep --ignore-case --perl-regexp --only-matching '.*(.PDF)'| uniq | xargs -I{} mv -i {} DESTINATION/

Ich möchte OK drucken, wenn eine Übereinstimmung gefunden wird, oder nicht, wenn keine Übereinstimmung gefunden wird. Ist es möglich, dies in die Kommandozeile aufzunehmen?

Vielen Dank.

FXux
quelle

Antworten:

1

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:

  1. 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.

  2. Dies ist eine Bash While-Schleife. Es durchläuft jede Ausgabezeile, die vom Befehl ganz am Ende des Skripts generiert wird (der Befehl "find").

  3. Dadurch wird der Dateiname aus der Ausgabezeile abgerufen und in einer Variablen (mit dem Namen "Datei") gespeichert.

  4. Hiermit wird der Dateiname in der Standardausgabe ohne eine neue Zeile am Ende ausgegeben.

  5. 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).

  6. Dies zeigt nur, dass eine Übereinstimmung gefunden wurde.

  7. Dies ist der eigentliche mv-Befehl, genau wie in Ihrem Code.

  8. 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.

atreyu
quelle
Nein, ich könnte ein Bash-Skript verwenden, ich weiß nur nicht, wie hahaha.
FXux
In pdfgrep wird die ungültige Option -m angezeigt. Auch wenn ich nicht zu viel frage, können Sie die Befehlszeile erklären?
FXux
Funktioniert @atreyu nicht richtig, verschiebt Dateien, in denen die Zeichenfolge nicht enthalten ist: /.
FXux
ah, du hast ein älteres pdfgrep, denke ich. Ich habe auch eine Maschine von mir mit einer alten Version gefunden. Meine Schuld dafür, dass ich die Fehlerprüfung nicht eingeschlossen habe. Lassen Sie einfach die Option "-m 1" weg und es sollte funktionieren. Die Antwort wurde aktualisiert, um die Befehle in einem Skriptformat anzuzeigen. Öffnen Sie einfach einen Texteditor und speichern Sie den Code in einer Datei (zB "mv-pdf-files.sh") und rufen Sie ihn dann wie folgt auf: "sh mv-pdf-files.sh". Sie könnten sich etwas einfallen lassen und die Verzeichnisse src / dest als Argumente an das Skript übergeben und den zu durchsuchenden String auch als Argument übergeben.
Atreyu
OH MAN, ARBEITET <3. Wenn ich nicht zu viel frage, könntest du das Drehbuch erklären? Ich liebe Bash, aber ich habe nicht viel Zeit zu lernen, zumindest in diesem Jahr.
FXux