For loop 从路径中删除fllename以复制zsh中的文件列表

For loop 从路径中删除fllename以复制zsh中的文件列表,for-loop,zsh,filenames,cp,For Loop,Zsh,Filenames,Cp,在zsh中,我希望将完整路径列表中的每个命名文件复制到指定目录中的相同文件名(没有完整路径)。这有什么问题吗 fnames="/opt/local/etc/apache2/httpd.conf /opt/local/etc/php74/php.ini" for f in ${fnames}; do cp ${f} ~/Downloads/${f}:t; done 我得到的错误是: cp: /opt/local/etc/apache2/httpd.conf /opt/loca

在zsh中,我希望将完整路径列表中的每个命名文件复制到指定目录中的相同文件名(没有完整路径)。这有什么问题吗

fnames="/opt/local/etc/apache2/httpd.conf /opt/local/etc/php74/php.ini"
for f in ${fnames}; do cp ${f} ~/Downloads/${f}:t; done
我得到的错误是:

cp: /opt/local/etc/apache2/httpd.conf /opt/local/etc/php74/php.ini: No such file or directory
在这个简短的示例命令中,我要做的是将
/opt/local/etc/apache2/httpd.conf
复制到
~/Downloads/httpd.conf
,然后将
/opt/local/etc/php74/php.ini
复制到
~/Downloads/php.ini
。(实际上,
fnames
将更长,因此我希望循环查看名称列表。)


(请温柔一点:我不熟悉这种zsh脚本!)

在我看来,有两个问题:

1-阵列必须为:

fnames=(/opt/local/etc/apache2/httpd.conf /opt/local/etc/php74/php.ini)
2-要仅获取文件名而不使用路径,请使用:

${f:t}
而不是

${f}:t

我想我刚刚知道怎么做了。关键是我不需要从路径中删除文件名。仅此而已:
表示f在$(echo“$fnames”);执行cp${f}~/下载;done
与我的原始帖子相比,我更喜欢我评论中的方法,因为我仍然使用字符串而不是数组,并且可以避免使用
:t
从路径中删除文件名。改用阵列路由有什么好处吗?