내 명령은 다음과 같습니다
find $PATH -name '$FILE.log' > /tmp/file-list.txt
다음과 같은 오류 메시지가 계속 나타납니다.
find: illegal option -- n
내가 여기서 뭘 잘못하고 있는 걸까?
답변1
그 오류 메시지로 판단해 보면, 그럴 것 같아요.
- "linux" 레이블에도 불구하고 Linux 기반 시스템에 있지 않을 수도 있습니다.
find
일반적으로 Linux 기반 시스템에서 발견되는 구현에서는 해당 단어를 사용하여 알 수 없는 옵션에 대한 오류를 나타내지 않기 때문입니다. - 이
$PATH
변수는 설정되지 않았습니다. 이는 실행 중인 쉘이 Bourne 또는 Korn 쉘(AT&T 구현)일 가능성이 있음을 나타냅니다.
저것불법적인 선택find
전통적인 Unix 구현에서 일반적인 표현입니다.
이러한 전통적인 구현은 또한필요하다와 같은 것을 사용하려면 최소한 하나의 파일 매개변수가 있어야 합니다 -name
.
그렇지 않고 -name
다음 인수인 경우 (술어가 아닌) 옵션으로 처리됩니다 find
.
( -n
첫 번째 옵션 -name
은 의 약어임 -n -a -m -e
)은 유효한 옵션이 아닙니다 find
.
따라서 확장이 $PATH
논란으로 이어지지 않을 가능성이 높습니다.
이는 다음과 같은 상황에서 발생합니다.
$PATH
설정되지 않음$PATH
빈 문자열로 설정$PATH
공백, 탭 또는 줄 바꿈만 포함합니다(기본값$IFS
).
$PATH
는 명령이 포함된 실행 파일을 찾기 위해 콜론으로 구분된 디렉터리 목록을 포함하는 특수 변수이므로 3 find
개, 아마도 2개( find
명령이 현재 디렉터리에 있지 않은 경우)를 제외할 수 있습니다. 그렇지 않으면 오류가 발생합니다 find: command not found
.
설정 해제된 경우 $PATH
( 1
위), (또는 일반적으로 사용되는 술어 등 execvp()
) 및 일부 쉘(일반적으로 이러한 쉘에서 발견되는 Korn 및 Bourne 쉘 포함)에서env
find
-exec
전통적인운영 체제)은 find
기본 검색 경로에서 검색하여 찾을 수 있습니다( bash
셸과 같은 경로는 이 작업을 수행하지 않지만 $PATH
시작 시 설정되지 않은 경우 기본값으로 설정(내보내지는 않지만)).
여기, 당신이 원하는 것 같아요:
$PATH
저장소 디렉터리 이름과 다른 변수 이름을 사용하세요(예$dir
: ).- 변수를 인용하십시오
${dir:-.}
비어 있거나 설정되지 않은 경우 현재 디렉터리를 기본값으로 사용하려는 경우$dir
사용합니다 .$PATH
( 변수가 설정되지 않은 이유를 조사할 수도 있습니다 . 이는 매우 드문 일입니다.)
그래서:
dir=some-dir
find "${dir:-.}" -name "$FILE.log"
$dir
, 로 시작하지 않는 것으로 가정하고 연산자(예: , , ) -
가 아니며 와일드카드( , , )를 포함 하지 않습니다 . , 문자 그대로 이름이 지정된 파일 이 아닌 ).find
!
(
)
$FILE
*
?
[...]
$FILE.log
something.log
something
$FILE
$FILE.log
답변2
$PATH
(일반적으로 재정의하지 않는 한 많은 문제가 발생하지만) 콜론으로 구분된 디렉터리 목록입니다. find
명령줄에서 공백으로 구분된 디렉터리 목록을 가져옵니다.
find /path/to/dir1 /path/to/dir2 -name "$FILE.log"
또한 작은따옴표는 쉘이 변수를 평가하는 것을 비활성화하므로 $FILE.log
위에서 언급한 것처럼 큰따옴표가 필요할 수 있습니다.
$PATH
다음과 같은 다양한 방법으로 공백으로 구분된 목록으로 변환 할 수 있습니다 .
echo $PATH | sed 's/:/ /g'
그리고 명령 대체를 사용하여 목록을 find 명령에 넣으십시오.
find $(echo $PATH | sed 's/:/ /g') -name "$FILE.log"
답변3
Google에서 동일한 오류 메시지 "불법 옵션 -n"을 검색했을 때 여기로 왔습니다.
저는 MacOS를 사용하고 우리 팀은 Linux/Windows를 사용합니다. 그들의 버전은 find
더 관대해 보입니다.
깨진 명령은 다음과 같습니다
find -name "*.jsonnet"
첫 번째 인수에 점을 추가하여 문제를 해결합니다.
find . -name "*.jsonnet"