저는 기계 2대를 사용하는데 둘 다Red Hat Enterprise Linux AS 릴리스 3(Taroon 업데이트 2) (저는 /etc/*-release에서 확인합니다).
나는 그들이 동일한 기본 쉘인 ps -p $$
bash를 사용하고 있음을 확인했습니다.
와일드카드 패턴을 사용하여 find 명령을 실행해 보았습니다. find path -name 패턴 -type f -ctime +3
그리고 패턴에는 * 문자가 와일드카드 문자로 포함되어 있습니다.
첫 번째 시스템은 와일드카드를 확장하는 것으로 보이며 오류가 발생합니다.
find /home/primbat/testing -name sftp_bcs_report_*.log -type f -ctime +7
find: paths must precede expression
다음과 같이 구분된 두 개의 qoutes 사이에 패턴을 생성하거나 \"sftp_bcs_report_*.log\"
스크립트 set -f
에서 와일드카드 확장을 억제하는 데 사용해야 합니다.
다른 컴퓨터에서는 그런 문제가 없습니다. 어떤 아이디어가 있나요?
답변1
기본적으로 파일이 셸과 일치하면 셸은 와일드카드를 확장하지만 일치하는 항목이 없으면 확장되지 않은 상태로 둡니다. 예를 들어 이 명령을 실행하면 touch /tmp/111; touch /tmp/11*
/tmp/111에 mtime이 생성되고 업데이트되지만, /tmp가 비어 있는 상태에서 호출하면 touch /tmp/11*
/tmp에 "11*"이라는 파일이 생성됩니다.
이것은 조개의 다소 이상한 특징입니다. 때로는 중간 기능인 특별한 해킹 없이는 올바른 확장이 불가능합니다. 대부분의 최신 쉘은 일반적인 경우를 위한 특수 옵션을 개발했습니다. 예를 들어 bash의 "shopt -s failureglob"은 와일드카드 일치에 실패한 명령 실행을 거부합니다.
find의 와일드카드 확장에 의존해야 하므로 확장을 방지하려면 다음과 같은 패턴을 셸에서 인용해야 합니다.
find /home/primbat/testing -name 'sftp_bcs_report_*.log' -type f -ctime +7
(작은 따옴표에 유의하십시오). 0개 또는 1개의 파일에 대해서는 작동하지만 2개 이상의 파일에 대해서는 명령 구문이 깨져서 불평합니다. 이것이 동료가 말한 것입니다.아르세그. "set -f"는 확장 기능을 완전히 비활성화합니다. 이는 좋은 진단 방법이지만 향후 이동을 위해 수중 갈퀴를 제공할 수 있습니다. 견적이 더 쉬워졌습니다 :)
답변2
두 번째 시스템의 홈 디렉토리에는 일치하는 파일이 없는 것 같지만 sftp_bcs_report_*.log
첫 번째 서버에는 이러한 파일이 여러 개 있습니다. 사용 시 find
스키마는 항상 인용되어야 합니다.