
希望給個建議。在 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
似乎是臭名昭著的。絕對有可能讓這變得更加安全,但這超出了我的能力範圍。我會將其留給其他使用者。