希望给个建议。在 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 上使用zsh
shell,假设lpr
命令本身是正确的:
lpr -P BarcodePrinter -o raw < ~/Downloads/Barcodes*.zpl(.Nom[1])
glob(.Nom[1])
限定符更改了前面的 globbing 模式的行为,以便它仅匹配常规文件(这就是所做的.
),并且如果没有匹配,则它根本不扩展为任何内容(N
, 对应于shellnullglob
中bash
)。
按照修改时间戳的顺序对匹配结果进行排序om[1]
,并仅从列表中挑选第一个条目,即最近修改的匹配文件。
如果模式与任何内容都不匹配(如果您指定了错误的目录或输入了错误的文件名,则不会执行此操作),shell 会抱怨
zsh: no such file or directory: ~/Downloads/Barcodes*.zpl(.Nom[1])
当 shell 报告此类错误时,它总是会写出无法找到的文件的路径名(您的问题中的错误中缺少此路径名,并且可以更轻松地诊断问题)。
通过下面评论中发布的额外信息,很明显文件的实际名称匹配~/Downloads/zebraBarcodes*.zpl
or~/Downloads/*Barcodes*.zpl
而不是~/Downloads/Barcodes*.zpl
.与上面相同的方法和更新的模式是可行的。
答案2
这里可能发生的情况是,默认行为是ls
按列将文件打印到标准输出,这可能会导致多个文件名位于一行中。ls
也不会打印整个文件名(即,包括目录前缀),因此使用cd
first 进入目录,以便后续命令正确定位所选文件。我也不会使用 globls
来过滤这样的文件。使用grep
,它使用正则表达式。
尝试:
cd /Username/Downloads | dir -w 1 -t /UserName/Downloads/ | grep "^Barcodes.*\.zpl$" | head -1 | lpr -P BarecodePrinter -o raw
另外,请检查您的打印机“BarecodePrinter”拼写是否正确。
我愿意不是建议使用ls
或dir
列出要解析的文件,find
会更好,但我不知道如何正确设置它以按时间排序,就像ls
没有awk
魔法一样。
与find
,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
即使这样也可能因为文件名不正确转义而被破坏,这find
似乎是臭名昭著的。绝对有可能让这变得更加安全,但这超出了我的能力范围。我会将其留给其他用户。