如果我将 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要删除的字符串。您不想指定suffix,因此使用 POSIXbasename您只能这样做:

basename string

即每次调用一个字符串basenamebasename为每个路径名调用单独的语法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已经能够通过其谓词打印找到的文件的基本名称(尾部)(并且在 GNUbasename添加-a/之前已经有几十年了--multiple-printf

find … -printf '%f\n'

在 zsh 递归 globbing 中,您可以:t在 glob 限定符中使用修饰符(来自 70 年代末的 csh 历史和参数扩展)来获取t这些路径的所有信息:

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

(还有Nullglob、Dotglob 限定符,.相当于finds -type f)。


1 严格来说,与大多数实用程序一样,它也接受--表示选项的结束,即使 POSIX 没有为 指定任何选项basename。当你不能保证不会以 开头时,你可以使用它 forbasename -- -file-.jpg .jpg或 in 。basename -- "$file"$file-

相关内容