使用通配符*执行cp批量复制文件不生效的原因是什么?
报错原因
你需要先理解Shell通配符的展开逻辑和cp命令的参数规则:
- Shell会在执行命令前先解析展开通配符,且只会匹配当前已存在的文件。你当前目录下只有
1.txt、2.txt、3.txt三个文件,没有后缀为.txt.cp的文件,所以*.txt.cp不会被展开,会作为原始字符串直接传给cp命令。 cp命令的多参数规则:如果传入的参数数量≥3,cp会默认最后一个参数是目标目录,要求把前面所有的源文件都复制到这个目录下。
你执行cp *.txt *.txt.cp时,Shell展开后实际执行的命令是:
cp 1.txt 2.txt 3.txt *.txt.cp
此时最后一个参数*.txt.cp不是已存在的目录,就触发了目标不是目录的报错。
正确实现批量复制的方法
可以用Shell循环实现需求,命令如下:
for f in *.txt; do cp "$f" "$f.cp"; done
也可以用xargs实现:
ls *.txt | xargs -I {} cp {} {}.cp
内容的提问来源于stack exchange,提问作者Xian Qi
相关产品推荐
相关产品推荐

