Mac OS X Catalina で実行中のシェル スクリプトがファイルを見つけられない

Mac OS X Catalina で実行中のシェル スクリプトがファイルを見つけられない

提案を期待しています。Mac OS X Catalina でシェル スクリプトを使用したところ、スクリプトが壊れました。セキュリティの変更が多数あることは知っていますが、ダウンロード フォルダーにアクセスするための変更をまだ見つけていません。印刷するファイルにアクセスできないため、スクリプト エラーが発生します。スクリプトは次のとおりです。

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

コマンド自体は正しいzshと仮定して、macOS のシェルを使用します。lpr

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

glob(.Nom[1])修飾子は、先行するグロブ パターンの動作を変更して、通常のファイルのみに一致するようにします (これが の機能です.)。また、一致がない場合は何も展開されないようにします ( はシェルNの に相当します)。nullglobbash

一致の結果を変更タイムスタンプの順に並べom[1]、リストから最初のエントリ、つまり一致するファイルの中で最も最近変更されたエントリのみを選択します。

パターンが何にも一致しない場合、間違ったディレクトリを指定したり、ファイル名を誤って入力した場合はそうはなりませんが、シェルは次のようにエラーを出します。

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

シェルは、このタイプのエラーを報告するときに、常に見つからないファイルのパス名を書き出します (これは質問のエラーには含まれていないため、問題の診断が容易になります)。


以下のコメントに投稿された追加情報から、ファイルの実際の名前は~/Downloads/zebraBarcodes*.zplではなく~/Downloads/*Barcodes*.zplまたは と一致することが明らかです~/Downloads/Barcodes*.zpl。更新されたパターンを使用した上記と同じアプローチが機能します。

答え2

ここで何が起こっているかと言うと、 のデフォルトの動作では、lsファイルを列ごとに stdout に出力するため、1 行に複数のファイル名が表示される可能性があります。lsまた、 はファイル名全体 (つまり、ディレクトリ プレフィックスを含む) を出力しないため、cd最初に を使用してディレクトリに移動し、後続のコマンドで選択したファイルを適切にターゲットにする必要があります。 また、 で glob を使用してlsそのようなファイルをフィルターすることもお勧めしません。grepでは正規表現が使用されます。

試す:

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

また、プリンター「BarecodePrinter」のスペルが正しいかどうかを確認してください。

私はしますない解析するファイルをリストするには、またはを使用lsすることをお勧めしますが、魔法なしで時間で並べ替えるように適切に設定する方法がわかりません。dirfindlsawk

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この方法も機能しなくなる可能性があります。これは悪名高いようです。これをさらに安全にすることは間違いなく可能ですが、私の手に負えません。他のユーザーに任せます。

関連情報