실행할 스크립트가 있지만 호출하면 find . -depth 1 -type d
다음 오류가 발생합니다.
find: paths must precede expression: `1'
이것은 실패한 라인입니다.
for dir in `find . -depth 1 -type d`
do
....
나는 성공하지 못한 채 많은 것을 시도했습니다. 적어도 나에게는 경로가 "1"보다 앞에 있기 때문에 오류가 발생하는 이유를 실제로 이해하지 못합니다.
답변1
그러나 이 -depth
스위치는 매개변수를 사용하지 않으므로 -maxdepth does
다음과 같습니다.
for dir in `find . -depth -maxdepth 1 -type d`
do
....
작동해야합니다.
-depth
매뉴얼 페이지의 매개변수는 디렉토리 내용이 먼저 처리됨을 의미합니다.
답변2
이 명령은 find
FreeBSD 버전(또는 유사한 버전)용으로 작성되었으며 지원되지 않는 다른 버전을 사용하고 있습니다. 오류 메시지에 따르면 GNU일 수 있습니다. FreeBSD 버전에는 두 가지 옵션이 있습니다(-depth n
-depth
매뉴얼 페이지):
-깊이
항상 true입니다. 이식 불가능한 -d 옵션과 동일합니다. find가 깊이 우선 순회를 수행하도록 합니다. 즉, 디렉토리를 마지막 순서로 방문하고 디렉토리의 모든 항목이 디렉토리 자체보다 먼저 실행됩니다. 기본적으로 find는 디렉토리에 순차적으로, 즉 내용 이전에 액세스합니다. 기본값은 너비 우선 순회가 아닙니다.-lengthn
파일이 탐색 시작점을 기준으로 깊이 n에 있는 경우 참입니다.
첫 번째는 표준(*)이고 두 번째는 표준이 아닙니다. 표준은 인수를 취하지 않고 find 표현식 내 또는 뒤에 별도의 인수(경로)를 제공할 수 없기 때문에(보시다시피) FreeBSD 버전은 어느 정도 이름을 덮어쓰는 일을 피할 수 있습니다. (인수를 잊어버리면 -depth
의미가 바뀌기 때문에 여전히 오류가 발생하기 쉽습니다 .)
GNU와 Busybox는 함께 사용하면 특정 깊이가 필요할 때 사용할 수 있는 동일한 비표준 기능을 가지고 있습니다.-mindepth n
-maxdepth n
find . -mindepth 1 -maxdepth 1 -type d
for f in $(find ...)
파일 이름에 공백이 포함되어 있으면 문제가 발생할 수 있으므로 이를 사용해서는 안 됩니다 .
바라보다:
- 배쉬 트랩mywiki.wooledge.org에서
- 공백이나 기타 특수 문자 때문에 쉘 스크립트가 멈추는 이유는 무엇입니까?
(*텍스트에서 알 수 있듯이 -depth
사전/사후 주문 전환에서는 이 이름이 정확하지 않습니다.)