最近发现之前写好的shell脚本里cp命令拷贝文件夹,丢失了一层文件夹。才发现cp命令里还有一层这么容易让人混淆的用法,为避免继续踩坑,特此记载。
现在假定文件存在的目录如下面所示:
--from
--from/fone
--from/fone/hello.txt
--to
现要将from文件夹之下的所有目录拷贝到to文件夹之下,使用时就会遇到极易混淆的如下4条命令:cp -rf from/ to
cp -rf from/ to1
cp -rf from/* to
cp -rf from/* to1
第一种:cp -rf from/ to
from整个文件夹都拷贝到to文件夹里去了。
--to
--to/from
--to/from/fone
--to/from/fone/hello.txt
第二种:cp -rf from/ to1
to1代表本来不存在的文件夹。
结果:
from文件夹没有拷贝到to里面去。
--to1
--to1/fone
--to1/fone/hello.txt
第三种:cp -rf from/* to
结果:
和第二种一样,没有复制from文件夹到to文件夹里面去。
--to
--to/fone
--to/fone/hello.txt
第四种:cp -rf from/* to1
结果:
to1下只有最里层的文件。
--to1
--to1/hello.txt
经过实践,上面命令格式可以统一为:cp -rf source target
无论target后面带不带斜杠/,系统都认为它是目录。
不相信你就这样试一下:cp -rf from to1.txt
查看to1.txt文件属性,就是文件夹。
总结:cp -rf source target 命令中target一定是文件夹
由以上4种情况可以得知,当业务中目标文件夹可能存在或不存在时,没有哪一条命令是在两种情况下可以同时使用的,最好的解决办法就是确保目标文件夹一定存在。
拿上面的例子来说,就是拷贝from里面的文件夹之前,先把to文件夹生成好。mkdir -p to
以上4种易混淆的命令,为了加深记忆,我也顺便总结了一下:记忆诀窍:
source里带*的一定是不包含source当前这一层文件夹的。
source里带*的,且target目标目录不存在的,是最特殊的情形:只拷贝最里层的文件。
综上所述,拷贝文件夹的业务,我们以后就通过两条命令的思路来实现就完全OK了。
1.不拷贝source里当前的目录到target里去,即不拷贝from文件夹到to里面:mkdir -p to
cp -rf from/* to
2.要拷贝source里当前的目录到target里去,即to里面要有from这一层文件夹:mkdir -p to
cp -rf from/ to