Basename을 find와 함께 사용하면 추가 피연산자를 감지합니다.

Basename을 find와 함께 사용하면 추가 피연산자를 감지합니다.

다음과 같이 find를 통해 basename을 실행해 보았습니다.

find ./test_folder -type f -exec basename {} +

하지만 다음과 같은 오류가 발생합니다.

basename: extra operand './test_folder/test/file.crt'

왜 이런 일이 발생합니까?

답변1

POSIXbasename이것만 지원됩니다:

basename string [suffix]

POSIX는 세 개 이상의 문자열이 제공될 때 어떤 일이 발생하는지 지정하지 않지만 대부분(전부는 아니지만) 구현에서 구문 오류가 발생합니다.extra operand당신은 하나를 얻을.

suffix그러나 귀하의 경우에는 두 번째 문자열이 삭제될 문자열 로 해석되므로 두 문자열도 너무 많습니다 . 을 지정하고 싶지 않으므로 suffixPOSIX에서는 basename다음만 수행할 수 있습니다.

basename string

즉, 매번 하나의 문자열이 호출됩니다 basename. basename각 경로 이름에 대해 별도의 호출을 호출하는 구문은 다음 find과 같습니다.

find … -exec basename {} \;

(읽다-exec옵션 에 대해 알아보기find;와 )의 차이를 구합니다 +.

GNU, ast-open, toybox 및 FreeBSD 구현은 basename최소한 지원(GNU 및 ast-open 의 별칭 -a)을 사용하여 . 제거하여 사용해 주십시오.) 예:--multiplebasename--all-exec … +findsuffix-s …

find … -exec basename -a {} +

그러나 GNU 시스템을 사용하는 경우 find이미 검색된 파일의 기본 이름(예고편)을 해당 조건자를 통해 인쇄할 수 있습니다( GNU가 / 를 basename추가하기 -a수십 년 전이었습니다 --multiple) -printf.

find … -printf '%f\n'

zsh 재귀 globbing에서는 :tglob 한정자에 수정자(1970년대 후반 csh 기록 및 매개변수 확장에서 유래)를 사용하여 t다음 경로에 대한 모든 정보를 얻을 수 있습니다.

print -rC1 -- test_folder/**/*(ND.:t)

( s 와 동등한 Nullglob 및 Dotglob 한정자 도 있습니다 )..find-type f


1 엄밀히 말하면,대부분의 유틸리티와 마찬가지로 --옵션 종료 도 허용합니다.단, POSIX가 이에 대한 옵션을 지정하지 않더라도 마찬가지입니다 basename. for 또는 in으로 시작하지 않을 것이라고 보장할 수 없는 경우에 사용할 수 있습니다 basename -- -file-.jpg .jpg.basename -- "$file"$file-

관련 정보