
Hoffe auf einen Vorschlag. Ich verwende ein Shell-Skript in Mac OS X Catalina, das das Skript beschädigt hat. Ich weiß, dass es viele Sicherheitsänderungen gab, habe aber bisher noch keine Änderung für den Zugriff auf den Download-Ordner gefunden. Das Skript weist Fehler auf, weil es nicht auf die zu druckende Datei zugreifen kann. Das Skript lautet:
do shell script "cat `ls -t /UserName/Downloads/Barcodes*.zpl | head -1` | lpr -P BarcodePrinter -o raw " with administrator privileges
Habe mehrere Änderungen am Speicherort der Datei versucht. Der Download-Ordner erhält immer noch Dateien mit langem Namen, wo *
eine Variable für 20+ Zeichen wäre, die aus der Barcode-Datei generiert wurden. Der Druckername stimmt immer noch überein, aber der Fehler lautet:
No such file or directory
lpr: No file in print request
JEDER Vorschlag ist willkommen. Ich habe in Foren gesucht, bin aber ein absoluter Neuling und kann scheinbar nicht die richtige Lösung finden.
Antwort1
Verwenden der zsh
Shell unter macOS und vorausgesetzt, dass der lpr
Befehl selbst korrekt ist:
lpr -P BarcodePrinter -o raw < ~/Downloads/Barcodes*.zpl(.Nom[1])
Der (.Nom[1])
Glob-Qualifizierer ändert das Verhalten des vorhergehenden Globbing-Musters, sodass es nur mit regulären Dateien übereinstimmt (das tut es .
) und sich zu nichts erweitert, wenn keine Übereinstimmung vorhanden ist (das N
entspricht , nullglob
in der bash
Shell).
Die om[1]
Ergebnisse des Abgleichs werden nach dem Änderungszeitstempel sortiert und es wird nur der erste Eintrag aus der Liste ausgewählt, also die zuletzt geänderte der übereinstimmenden Dateien.
Wenn das Muster nicht übereinstimmt, was nicht der Fall wäre, wenn Sie das falsche Verzeichnis angeben oder einen Dateinamen falsch eingegeben haben, würde die Shell sich beschweren mit
zsh: no such file or directory: ~/Downloads/Barcodes*.zpl(.Nom[1])
Wenn die Shell einen Fehler dieser Art meldet, gibt sie immer den Pfadnamen der nicht gefundenen Datei aus (dies fehlt bei dem Fehler in Ihrer Frage und hätte die Diagnose des Problems erleichtert).
Mit den zusätzlichen Informationen, die in den Kommentaren unten gepostet wurden, ist klar, dass der tatsächliche Name der Dateien mit oder übereinstimmt ~/Downloads/zebraBarcodes*.zpl
und ~/Downloads/*Barcodes*.zpl
nicht mit ~/Downloads/Barcodes*.zpl
. Der gleiche Ansatz wie oben mit einem aktualisierten Muster würde funktionieren.
Antwort2
Was hier passieren könnte, ist, dass das Standardverhalten von darin ls
besteht, Dateien spaltenweise auf stdout zu drucken, was dazu führen kann, dass mehrere Dateinamen in einer Zeile stehen. ls
druckt auch keine vollständigen Dateinamen (d. h. einschließlich des Verzeichnispräfixes), also verwenden Sie cd
zuerst, um in das Verzeichnis zu gelangen, damit Ihre nachfolgenden Befehle die ausgewählten Dateien richtig ansprechen. Ich würde auch keinen Glob in verwenden, ls
um Dateien auf diese Weise zu filtern. Verwenden Sie grep
, das reguläre Ausdrücke verwendet.
Versuchen:
cd /Username/Downloads | dir -w 1 -t /UserName/Downloads/ | grep "^Barcodes.*\.zpl$" | head -1 | lpr -P BarecodePrinter -o raw
Überprüfen Sie außerdem, ob Ihr Drucker „BarecodePrinter“ richtig geschrieben ist.
Ich tuenichtIch empfehle die Verwendung von ls
oder dir
zum Auflisten Ihrer Dateien zum Parsen. find
Das wäre besser, aber ich weiß nicht, wie ich es richtig einrichten kann, um es wie ls
ohne awk
Zauberei nach Zeit zu sortieren.
Mit find
und :sort
awk
find /UserName/Downloads -maxdepth 1 -printf "\n%AD %AT %p\n" | grep ".*Barcodes.*\.zpl$" | sort -r | awk '{ print $3 }' | head -1 | lpr -P BarecodePrinter -o raw
Auch dies kann aufgrund falsch maskierter Dateinamen nicht funktionieren, wofür es find
anscheinend berüchtigt ist. Es ist definitiv möglich, dies noch sicherer zu machen, aber das liegt außerhalb meiner Reichweite. Das überlasse ich anderen Benutzern.