쉘 스크립트가 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])한정자는 이전 globbing 패턴의 동작을 변경하여 일반 파일에만 일치하고(이것이 바로 그 일입니다 .) 일치하는 항목이 없으면 전혀 확장되지 않습니다( , 셸 에서 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파일을 열 단위로 표준 출력으로 인쇄하는 것이므로 한 줄에 여러 파일 이름이 나타날 수 있다는 것입니다. ls전체 파일 이름(예: 디렉터리 접두사 포함)도 인쇄되지 않으므로 cd먼저 명령을 사용하면 후속 명령이 선택한 파일을 올바르게 찾을 수 있도록 디렉터리로 이동합니다. 나는 ls그러한 파일을 필터링하기 위해 glob을 사용하지 않을 것입니다 . 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악명 높은 것으로 보입니다. 이것을 더 안전하게 만드는 것은 확실히 가능하지만 그것은 내 능력을 벗어납니다. 다른 사용자에게 맡기겠습니다.

관련 정보