다음과 같이 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
그러나 귀하의 경우에는 두 번째 문자열이 삭제될 문자열 로 해석되므로 두 문자열도 너무 많습니다 . 을 지정하고 싶지 않으므로 suffix
POSIX에서는 basename
다음만 수행할 수 있습니다.
basename string
즉, 매번 하나의 문자열이 호출됩니다 basename
. basename
각 경로 이름에 대해 별도의 호출을 호출하는 구문은 다음 find
과 같습니다.
find … -exec basename {} \;
(읽다-exec
옵션 에 대해 알아보기find
;
와 )의 차이를 구합니다 +
.
GNU, ast-open, toybox 및 FreeBSD 구현은 basename
최소한 지원(GNU 및 ast-open 의 별칭 -a
)을 사용하여 . 제거하여 사용해 주십시오.) 예:--multiple
basename
--all
-exec … +
find
suffix
-s …
find … -exec basename -a {} +
그러나 GNU 시스템을 사용하는 경우 find
이미 검색된 파일의 기본 이름(예고편)을 해당 조건자를 통해 인쇄할 수 있습니다( GNU가 / 를 basename
추가하기 -a
수십 년 전이었습니다 --multiple
) -printf
.
find … -printf '%f\n'
zsh 재귀 globbing에서는 :t
glob 한정자에 수정자(1970년대 후반 csh 기록 및 매개변수 확장에서 유래)를 사용하여 t
다음 경로에 대한 모든 정보를 얻을 수 있습니다.
print -rC1 -- test_folder/**/*(ND.:t)
( s 와 동등한 N
ullglob 및 D
otglob 한정자 도 있습니다 )..
find
-type f
1 엄밀히 말하면,대부분의 유틸리티와 마찬가지로 --
옵션 종료 도 허용합니다.단, POSIX가 이에 대한 옵션을 지정하지 않더라도 마찬가지입니다 basename
. for 또는 in으로 시작하지 않을 것이라고 보장할 수 없는 경우에 사용할 수 있습니다 basename -- -file-.jpg .jpg
.basename -- "$file"
$file
-