![如果我将 Basename 与 find 一起使用,它会检测到额外的操作数](https://linux22.com/image/226252/%E5%A6%82%E6%9E%9C%E6%88%91%E5%B0%86%20Basename%20%E4%B8%8E%20find%20%E4%B8%80%E8%B5%B7%E4%BD%BF%E7%94%A8%EF%BC%8C%E5%AE%83%E4%BC%9A%E6%A3%80%E6%B5%8B%E5%88%B0%E9%A2%9D%E5%A4%96%E7%9A%84%E6%93%8D%E4%BD%9C%E6%95%B0.png)
我尝试通过 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
即每次调用一个字符串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
已经能够通过其谓词打印找到的文件的基本名称(尾部)(并且在 GNUbasename
添加-a
/之前已经有几十年了--multiple
)-printf
:
find … -printf '%f\n'
在 zsh 递归 globbing 中,您可以:t
在 glob 限定符中使用修饰符(来自 70 年代末的 csh 历史和参数扩展)来获取t
这些路径的所有信息:
print -rC1 -- test_folder/**/*(ND.:t)
(还有N
ullglob、D
otglob 限定符,.
相当于find
s -type f
)。
1 严格来说,与大多数实用程序一样,它也接受--
表示选项的结束,即使 POSIX 没有为 指定任何选项basename
。当你不能保证不会以 开头时,你可以使用它 forbasename -- -file-.jpg .jpg
或 in 。basename -- "$file"
$file
-