首页 > 解决方案 > 如何通过单个扩展名复制所有文件

问题描述

我有文件列表 a.xxx a.yyy。a.zz

例如,我需要通过按扩展名选择复制所有文件

ls *.xxx | xargs cp a.* dir

我写这样的代码

ls mysql/db/*.MYD | xargs -n1 basename | sed 's/\.MYD//g' | xargs -i cp mysql/db/{}.* new_folder

但得到错误

cp: cannot stat 'mysql/db/ps_opc_social_customer.*'

标签: linuxbashxargs

解决方案


这里的问题是,*最后一个命令中的最后一个命令会在您按下回车的那一刻被 shell 扩展,因此复制命令不会得到扩展的字符串,而是文字<file>.*字符串。您需要一次性获取所有需要的文件,或者使用新的 shell 为您进行 glob 扩展:

ls mysql/db/*.MYD | xargs -n1 basename | sed 's/\.MYD//g' | xargs -i bash -c "cp mysql/db/{}.* new_folder"

推荐阅读