记一次cp错误

前两天在编写脚本时遇到一个奇怪错误

rm -rf /Users/yzq/b/*
cp -r /Users/yzq/a/* /Users/yzq/b

使用这两个命令将a下面的工程拷贝的b中,然后编译b却始终报错,提示某个framework文件重复

a工程编译是没有问题的
手动清空b,将a中的文件手动复制到b编译也没有问题

最初以为是rm -rf /Users/yzq/b/*命令没有清除掉某些缓存或者隐藏文件之类的,后来验证发现和rm无关

经过文件比较发现报错的framework与正确的framework下某个文件存在差异,正确的是以链接(快捷方式)的方式存在的,而错误的是一个文件夹,文件夹下还有对应的文件,原来这种错误是我们复制时没有保留对应的文件属性导致的,使用cp -a /Users/yzq/a/* /Users/yzq/b进行复制即可解决,因为-a在复制的同时保留了文件的链接及文件属性

所以正确的命令应该是

rm -rf /Users/yzq/b/*
cp -a /Users/yzq/a/* /Users/yzq/b    

cp命令的一些参数解释

-a:此选项通常在复制目录时使用,它保留链接、文件属性,并递归复制目录下的所有内容。其作用等于-dpr参数组合。
-d:复制时保留链接(快捷方式)。
-f:覆盖已经存在的目标文件而不给出提示。
-i:与-f选项相反,在覆盖目标文件之前给出提示,要求用户确认是否覆盖,回答”y”时目标文件将被覆盖。
-p:除复制文件的内容外,还把修改时间和访问权限也复制到新文件中。
-r:若给出的源文件是一个目录文件,此时将复制该目录下所有的子目录和文件。
-l:不复制文件,只是生成链接文件。