El script de Shell no encuentra el archivo ejecutándose en Mac OS X Catalina

El script de Shell no encuentra el archivo ejecutándose en Mac OS X Catalina

Esperando una sugerencia. Usando un script de shell en Mac OS X Catalina que rompió el script. Sé que hubo muchos cambios de seguridad, pero hasta ahora no he descubierto modificaciones para acceder a la carpeta de descargas. Errores de script porque no puede acceder al archivo para imprimir. El guión es:

do shell script "cat `ls -t /UserName/Downloads/Barcodes*.zpl | head -1` | lpr -P BarcodePrinter -o raw " with administrator privileges

Probé varias modificaciones para la ubicación del archivo. La carpeta de descargas todavía recibe un archivo con un nombre largo que *sería variable para más de 20 caracteres generados a partir del archivo de código de barras. El nombre de la impresora aún coincide pero el error es:

No such file or directory
lpr:  No file in print request

Se agradece CUALQUIER sugerencia. He estado buscando en foros pero soy un novato y parece que no puedo encontrar la solución correcta.

Respuesta1

Usando el zshshell en macOS, suponiendo que el lprcomando en sí sea correcto:

lpr -P BarcodePrinter -o raw < ~/Downloads/Barcodes*.zpl(.Nom[1])

El (.Nom[1])calificador global cambia el comportamiento del patrón global anterior para que solo coincida con archivos normales (eso es lo que .hace) y para que se expanda a nada si no hay ninguna coincidencia (el N, corresponde nullgloben el bashshell).

Ordena om[1]los resultados de la coincidencia en orden de marca de tiempo de modificación y selecciona sólo la primera entrada de la lista, es decir, el archivo coincidente modificado más recientemente.

Si el patrón no coincide con nada, lo cual no sucedería si especifica el directorio incorrecto o ha escrito mal un nombre de archivo, el shell se quejará con

zsh: no such file or directory: ~/Downloads/Barcodes*.zpl(.Nom[1])

El shell siempre escribirá la ruta del archivo que no se puede encontrar cuando informa este tipo de error (esto falta en el error de su pregunta y habría facilitado el diagnóstico del problema).


Con la información adicional publicada en los comentarios a continuación, está claro que el nombre real de los archivos coincide con ~/Downloads/zebraBarcodes*.zplo ~/Downloads/*Barcodes*.zplen lugar de ~/Downloads/Barcodes*.zpl. Funcionaría el mismo enfoque que el anterior con un patrón actualizado.

Respuesta2

Lo que podría estar sucediendo aquí es que el comportamiento predeterminado lses imprimir archivos en la salida estándar por columna, lo que puede causar que varios nombres de archivos estén en una línea. lstampoco imprime nombres de archivos completos (es decir, incluido el prefijo del directorio), así que use cdprimero para ingresar al directorio para que los comandos siguientes se dirijan correctamente a los archivos seleccionados. Tampoco usaría un globo lspara filtrar archivos como ese. Use grep, que usa expresiones regulares.

Intentar:

cd /Username/Downloads | dir -w 1 -t /UserName/Downloads/ | grep "^Barcodes.*\.zpl$" | head -1 | lpr -P BarecodePrinter -o raw

Además, verifique si su impresora "BarecodePrinter" está escrita correctamente.

noSería mejor usar lso direnumerar sus archivos para analizarlos find, pero no sé cómo configurarlo correctamente para ordenar por tiempo como lssin awkmagia.

Con findy :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

Incluso esto puede fallar debido a nombres de archivos escapados incorrectamente, lo cual findaparentemente es notorio. Definitivamente es posible hacer esto aún más seguro, pero está fuera de mi alcance. Eso se lo dejo a otros usuarios.

información relacionada