Shell-Skript findet unter Mac OS X Catalina keine laufende Datei

Shell-Skript findet unter Mac OS X Catalina keine laufende Datei

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 zshShell unter macOS und vorausgesetzt, dass der lprBefehl 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 Nentspricht , nullglobin der bashShell).

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*.zplund ~/Downloads/*Barcodes*.zplnicht 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 lsbesteht, Dateien spaltenweise auf stdout zu drucken, was dazu führen kann, dass mehrere Dateinamen in einer Zeile stehen. lsdruckt auch keine vollständigen Dateinamen (d. h. einschließlich des Verzeichnispräfixes), also verwenden Sie cdzuerst, um in das Verzeichnis zu gelangen, damit Ihre nachfolgenden Befehle die ausgewählten Dateien richtig ansprechen. Ich würde auch keinen Glob in verwenden, lsum 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 lsoder dirzum Auflisten Ihrer Dateien zum Parsen. findDas wäre besser, aber ich weiß nicht, wie ich es richtig einrichten kann, um es wie lsohne awkZauberei nach Zeit zu sortieren.

Mit findund :sortawk

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

verwandte Informationen