如何使用cp命令结合通配符将文件复制到所有子目录
如何使用cp命令结合通配符将文件复制到所有子目录
嗨,这个需求我太熟了!你一开始想的cp ./my_file.txt ./d*其实没法直接实现目标——因为cp命令的规则是最后一个参数必须是目标位置,如果d*匹配出多个目录,cp会把前面的my_file.txt和除最后一个外的所有d*目录都当成“源文件”,最后一个目录才是目标,这样肯定会报错说“不是普通文件”之类的。
给你几个实用的解决方法,按需选就行:
方法一:用bash循环(最直观通用)
这是我最常用的方式,逻辑清晰,还能应对目录名带空格的情况:
for dir in ./d*; do cp ./my_file.txt "$dir/" done
解释一下:循环会逐个遍历所有匹配./d*的子目录,然后把my_file.txt复制到每个目录里。用双引号把$dir包起来是好习惯,万一哪天目录名带空格也不会出问题。
如果想写成一行精简版,直接把换行去掉就行:
for dir in ./d*; do cp ./my_file.txt "$dir/"; done
方法二:用find命令(适合更复杂的目录筛选)
如果需要更精准的目录匹配(比如只找当前目录下的直接子目录,排除嵌套目录),可以用find:
find ./ -maxdepth 1 -type d -name "d*" -exec cp ./my_file.txt {} \;
-maxdepth 1:只找当前目录下的直接子目录,不深入嵌套目录-type d:只筛选目录,避免匹配到同名文件-name "d*":匹配名字以d开头的目录-exec ... {} \;:对每个找到的目录执行cp命令,{}代表找到的目录路径
方法三:精准匹配d1到d10(避免额外目录)
如果担心d*会匹配到比如d11、dtest这类额外目录,可以用bash的大括号扩展,精准指定d1到d10:
for dir in ./d{1..10}; do cp ./my_file.txt "$dir/" done
这样循环只会遍历d1到d10这10个目录,完全不会出错。
备注:内容来源于stack exchange,提问作者brownser




