Shell 脚本找不到在 Mac OS X Catalina 中运行的文件

Shell 脚本找不到在 Mac OS X Catalina 中运行的文件

希望给个建议。在 Mac OS X Catalina 中使用 shell 脚本破坏了脚本。我知道有很多安全更改,但到目前为止还没有找到访问下载文件夹的修改。脚本错误,因为它无法到达要打印的文件。脚本是:

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

尝试了对文件位置的多次修改。下载文件夹仍然包含长名称的文件,其中*从条形码文件生成的 20 多个字符是可变的。打印机名称仍然匹配,但错误是:

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

任何建议表示赞赏。一直在搜索论坛,但我是个新手,似乎无法找到正确的解决方案。

答案1

在 macOS 上使用zshshell,假设lpr命令本身是正确的:

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

glob(.Nom[1])限定符更改了前面的 globbing 模式的行为,以便它仅匹配常规文件(这就是所做的.),并且如果没有匹配,则它根本不扩展为任何内容(N, 对应于shellnullglobbash)。

按照修改时间戳的顺序对匹配结果进行排序om[1],并仅从列表中挑选第一个条目,即最近修改的匹配文件。

如果模式与任何内容都不匹配(如果您指定了错误的目录或输入了错误的文件名,则不会执行此操作),shell 会抱怨

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

当 shell 报告此类错误时,它总是会写出无法找到的文件的路径名(您的问题中的错误中缺少此路径名,并且可以更轻松地诊断问题)。


通过下面评论中发布的额外信息,很明显文件的实际名称匹配~/Downloads/zebraBarcodes*.zplor~/Downloads/*Barcodes*.zpl而不是~/Downloads/Barcodes*.zpl.与上面相同的方法和更新的模式是可行的。

答案2

这里可能发生的情况是,默认行为是ls按列将文件打印到标准输出,这可能会导致多个文件名位于一行中。ls也不会打印整个文件名(即,包括目录前缀),因此使用cdfirst 进入目录,以便后续命令正确定位所选文件。我也不会使用 globls来过滤这样的文件。使用grep,它使用正则表达式。

尝试:

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

另外,请检查您的打印机“BarecodePrinter”拼写是否正确。

我愿意不是建议使用lsdir列出要解析的文件,find会更好,但我不知道如何正确设置它以按时间排序,就像ls没有awk魔法一样。

find,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

即使这样也可能因为文件名不正确转义而被破坏,这find似乎是臭名昭著的。绝对有可能让这变得更加安全,但这超出了我的能力范围。我会将其留给其他用户。

相关内容