我需要列出所有具有特定扩展名的文件,这些文件我只能在运行时知道,例如在特定文件中。或者扩展名存储在变量中。
我想使用fd
命令来列出它们。列出具有多个扩展名的所有文件的命令类似于fd -e java -e c ...
.
我尝试了两种方法来管理它,但它们看起来都很丑。
!/bin/zsh
str="c java"
extensions=(${=str})
arguments=(" -e "${^extensions})
# Why `arguments=" -e "${^extensions};echo $arguments` output -e c java
fd ${=arguments}
!/bin/zsh
str="c java"
extensions=(${=str})
option=(" -e ")
arguments=${option:^^extensions}
fd ${=arguments}
我希望有一个像这样的一行代码fd ${=${(" -e "):^^(${=str})}}
。
我还有一个问题:在第一个代码块中,为什么arguments=" -e "${^extensions};echo $arguments
输出“-ec java\n”而arguments=(" -e "${^extensions}); echo $arguments
输出“-ec -e java\n”?
答案1
Split str
,然后添加-e
到每个数组元素之前,然后再次拆分。
% str="c java"
% print -lr -- ${=${${=str}/#/-e }}
-e
c
-e
java
它比需要的更丑陋和更脆弱,因为第一步是将字符串拆分为列表。如果您将列表放在数组中,则可以只在前面添加然后拆分:
% a=(c java)
% print -lr -- ${=${a/#/-e }}
-e
c
-e
java
然而,虽然分割IFS
很短,但它是不正确的,因为它会在包含空格的输入上中断(或者更常见的是在$IFS
字符上中断)。
% a=(c java "with spaces")
% print -lr -- ${=${a/#/-e }}
-e
c
-e
java
-e
with
spaces
我不认为存在带有参数扩展的正确单行代码。有一个丑陋的P
glob 限定符,您可以通过 glob 一个东西并替换另一个数组来利用它。
% a=(c java "with spaces")
% print -lr -- .(P\''-e'\'e\''reply=($a)'\')
-e
c
-e
java
-e
with spaces
str="c java" extensions=(${=str}) # Why `arguments=" -e "${^extensions};echo $arguments` output -e c java
因为你正在创建一个字符串。在字符串上下文中,该^
标志不起作用。它的作用是创建单独的数组元素,但是当上下文不允许数组时,无法做到这一点。