
提案を期待しています。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
の に相当します)。nullglob
bash
一致の結果を変更タイムスタンプの順に並べ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
することをお勧めしますが、魔法なしで時間で並べ替えるように適切に設定する方法がわかりません。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
この方法も機能しなくなる可能性があります。これは悪名高いようです。これをさらに安全にすることは間違いなく可能ですが、私の手に負えません。他のユーザーに任せます。