我试图将文件夹A(主文件夹)中存在的4个文件复制到文件夹A中的所有子文件夹(1000)。为此,我使用了:
for i in *;
do
cp File1.bash $i
cp File2.sh $i
cp File3.R $i
cp File4.R $i
done
不幸的是,cp之后的所有文件的内容都会被覆盖在目标目录中。换句话说,文件:File2.sh,File3.R和File4.R的内容为File1.bash。
任何人都可以帮我解决这个问题吗?
非常感谢
答案 0 :(得分:1)
这里的问题是通配符*
被目录中的每个文件替换,包括File2.sh,File3.R等。因此,在循环期间的某个时刻,$ i将为'File2.sh',您将执行命令cp File1.bash File2.sh
,这将覆盖File2.sh(其他文件也会出现同样的问题)。
您应该使用仅列出ls -d */
。
例如:
for i in $(ls -d */)
do
cp File1.bash $i
cp File2.sh $i
cp File3.R $i
cp File4.R $i
done
另外,请注意cp可以将多个参数作为源,因此cp File1.bash File2.sh File3.R File4.R $i
应该执行您想要的操作。它也不容易出错,因为最后一个参数应该是一个目录,所以如果$ i是一个普通文件,cp会给出一个错误。
答案 1 :(得分:1)
for循环遍历当前目录中的所有文件和目录(名称以点开头的名称除外),包括文件File1.bash
,File2.s
,File3.R
,{{1所以它们迟早会出现在File4.R
命令的目标中并被覆盖。
有多种方法可以解决问题:
cp
for i in */ ; do
cp File1.bash File2.sh File3.R File4.R "$i"
done
与第一个答案相比,此代码不需要调用额外的外部命令(for i in * ; do
if test -d "$i" ; then
cp File1.bash File2.sh File3.R File4.R "$i"
fi
done
),并且无论如何都不能解析ls
的输出:)(它可能包含一些意想不到的内容。)
例如,将文件移动到名为ls
的目录(点很重要)或当前目录(.template
)之外的目录:
../template
更改了脚本(不会循环显示隐藏的mv File1.bash File2.sh File3.R File4.R .template
):
.template
最好将字符串括在双引号之间扩展变量的位置。然后脚本将正确使用包含空格换行符等的字符串。