在cp循环期间覆盖的文件

时间:2015-06-26 15:29:16

标签: unix

我试图将文件夹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。

任何人都可以帮我解决这个问题吗?

非常感谢

2 个答案:

答案 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.bashFile2.sFile3.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

使用双引号

最好将字符串括在双引号之间扩展变量的位置。然后脚本将正确使用包含空格换行符等的字符串。