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

相關內容