Linux高级技术:关于cp命令中拷贝所有的写法

发布时间:2007-09-30 21:39:36来源:红联作者:GiftPot

今天在编写一个脚本的时候,发现一个比较奇怪的问题:就是在使用cp拷贝当前目录下所有文件到目标目录的时候,源和目标目录大小不同。原来一直没有留意有这样的问题,后来查了些资料,才知道以前一直使用的格式有误。

一、预备

cp就是拷贝,最简单的使用方式就是:

cp oldfile newfile

但这样只能拷贝文件,不能拷贝目录,所以通常用:

cp -r old/ new/

那就会把old目录整个拷贝到new目录下。注意,不是把old目录里面的文件拷贝到new目录,而是把old直接拷贝到new下面,结果是:

引用

[root@dc5 test]# ll new/

total 4

drwxr-xr-x 2 root root 4096 Dec 15 11:55 old

那如果要保持源文件的所有权限,可以这样:

cp -rp old/ new/

-p参数,可以保持权限、宿主、时间栈,还可能包括link等;还有更简单的,就是用:

cp -a old/new/

-a参数,就等于-dpR。

二、问题1

好,我们来看看这次的问题。环境是:

◎两个目录:old、new,其中old里面有个三个内容:test1文件、test2目录,还有就是.test3,这是一个隐含文件。

引用

[root@dc5 test]# ll -laR

.:

total 20

drwxr-xr-x 4 root root 4096 Dec 15 11:55 .

drwxrwxrwt 7 root root 4096 Dec 15 11:59 ..

drwxr-xr-x 2 root root 4096 Dec 15 12:14 new

drwxr-xr-x 3 root root 4096 Dec 15 12:14 old

./new:

total 8

drwxr-xr-x 2 root root 4096 Dec 15 12:14 .

drwxr-xr-x 4 root root 4096 Dec 15 11:55 ..

./old:

total 12

drwxr-xr-x 3 root root 4096 Dec 15 12:14 .

drwxr-xr-x 4 root root 4096 Dec 15 11:55 ..

-rw-r--r-- 1 root root 0 Dec 15 12:07 .test3

-rw-r--r-- 1 root root 0 Dec 15 12:05 test1

drwxr-xr-x 2 root root 4096 Dec 15 12:14 test2

./old/test2:

total 8

drwxr-xr-x 2 root root 4096 Dec 15 12:14 .

drwxr-xr-x 3 root root 4096 Dec 15 12:14 ..

◎操作一:

引用

[root@dc5 test]# cp -a old/* new/

[root@dc5 test]# ll -laR new/

new/:

total 12

drwxr-xr-x 3 root root 4096 Dec 15 12:15 .

drwxr-xr-x 4 root root 4096 Dec 15 11:55 ..

-rw-r--r-- 1 root root 0 Dec 15 12:05 test1

drwxr-xr-x 2 root root 4096 Dec 15 12:14 test2

new/test2:

total 8

drwxr-xr-x 2 root root 4096 Dec 15 12:14 .

drwxr-xr-x 3 root root 4096 Dec 15 12:15 ..

问题出来了:隐含的.test3文件没有一齐拷贝到new目录下。

原因是:*参数使用不正确。这样的写法,通常都是因为熟悉了过去Dos的格式(包括我自己),而实际在bash环境下,cp使用*是不能匹配类似.开头的隐含文件的。

◎操作二

正确的写法应该这样:

引用

[root@dc5 test]# cp -a old/. new/

[root@dc5 test]# ll -laR new/

new/:

total 12

drwxr-xr-x 3 root root 4096 Dec 15 12:14 .

drwxr-xr-x 4 root root 4096 Dec 15 11:55 ..

-rw-r--r-- 1 root root 0 Dec 15 12:07 .test3

-rw-r--r-- 1 root root 0 Dec 15 12:05 test1

drwxr-xr-x 2 root root 4096 Dec 15 12:14 test2

new/test2:

total 8

drwxr-xr-x 2 root root 4096 Dec 15 12:14 .

drwxr-xr-x 3 root root 4096 Dec 15 12:14 ..

不用*号,而用.号代替。

还有一种比较复杂一些的写法:

引用

[root@dc5 test]# cp -a old/* old/.[^.]* new/

[root@dc5 test]# ll -laR new/

new/:

total 12

drwxr-xr-x 3 root root 4096 Dec 15 12:25 .

drwxr-xr-x 4 root root 4096 Dec 15 11:55 ..

-rw-r--r-- 1 root root 0 Dec 15 12:07 .test3

-rw-r--r-- 1 root root 0 Dec 15 12:05 test1

drwxr-xr-x 2 root root 4096 Dec 15 12:14 test2

new/test2:

total 8

drwxr-xr-x 2 root root 4096 Dec 15 12:14 .

drwxr-xr-x 3 root root 4096 Dec 15 12:25 ..

请注意写法,不要写成.*了。(原因请看下面)

三、问题2

上面提到不要写成.*,那.*代表什么?

引用

[root@dc5 test]# echo .*

. ..

.*代表的是当前目录,以及上一层目录。

所以,使用.*会导致更大的问题:

引用

[root@dc5 test]# cp -a old/.* new/

cp: cannot copy a directory, `old/..', into itself, `new/'

cp: cannot copy a directory, `old/..', into itself, `new/'

cp: will not create hard link `new/old' to directory `new/.'

cp: overwrite `new/.test3'? y

[root@dc5 test]# ll -laR new/

new/:

total 16

drwxr-xr-x 4 root root 4096 Dec 15 11:55 .

drwxr-xr-x 4 root root 4096 Dec 15 11:55 ..

-rw-r--r-- 1 root root 0 Dec 15 12:07 .test3

drwxr-xr-x 2 root root 4096 Dec 15 12:14 new

-rw-r--r-- 1 root root 0 Dec 15 12:05 test1

drwxr-xr-x 2 root root 4096 Dec 15 12:14 test2

new/new:

total 8

drwxr-xr-x 2 root root 4096 Dec 15 12:14 .

drwxr-xr-x 4 root root 4096 Dec 15 11:55 ..

-rw-r--r-- 1 root root 0 Dec 15 12:07 .test3

-rw-r--r-- 1 root root 0 Dec 15 12:05 test1

new/test2:

total 8

drwxr-xr-x 2 root root 4096 Dec 15 12:14 .

drwxr-xr-x 4 root root 4096 Dec 15 11:55 ..

也就是说,使用.*就等于这样了:

引用

[root@dc5 test]# cp -a old/. old/.. old/.test3 new/

[root@dc5 test]# echo old/.*

old/. old/.. old/.test3

四、扩展

其实这样的问题,不单cp命令有这样的问题,在所有涉及含有特殊字符意义文件的命令时,都需要考虑,例如rm:

引用

[root@dc5 new]# ll -a

total 12

drwxr-xr-x 3 root root 4096 Dec 15 12:14 .

drwxr-xr-x 4 root root 4096 Dec 15 11:55 ..

-rw-r--r-- 1 root root 0 Dec 15 12:07 .test3

-rw-r--r-- 1 root root 0 Dec 15 12:05 test1

drwxr-xr-x 2 root root 4096 Dec 15 12:14 test2

[root@dc5 new]# rm -rf *

[root@dc5 new]# ll -a

total 8

drwxr-xr-x 2 root root 4096 Dec 15 12:40 .

drwxr-xr-x 4 root root 4096 Dec 15 11:55 ..

-rw-r--r-- 1 root root 0 Dec 15 12:07 .test3

正确的写法应该是:

引用

[root@dc5 new]# rm -rf .* *

rm: cannot remove `.' or `..'

rm: cannot remove `.' or `..'

[root@dc5 new]# ll -a

total 8

drwxr-xr-x 2 root root 4096 Dec 15 12:42 .

drwxr-xr-x 4 root root 4096 Dec 15 11:55 ..

当然,这是一样的:

引用

[root@dc5 new]# rm -rf * .[^.]*

[root@dc5 new]# ll -a

total 8

drwxr-xr-x 2 root root 4096 Dec 15 12:44 .

drwxr-xr-x 4 root root 4096 Dec 15 11:55 ..

很多时候,预计的和实际的结果是完全不一样的。bash编写脚本尤其需要注意。

linux命令中的cp,Linux高级技术:关于cp命令中拷贝所有的写法相关推荐

  1. 数据加密技术在计算机网络安全中的应用实例,数据加密技术在计算机网络安全中的应用.doc...

    数据加密技术在计算机网络安全中的应用.doc 数据加密技术在计算机网络安全中的应用 摘 要:社会信息技术不断发展,随着计算机技术和网络的普及,网络生活成为了人们日常活动.网络的开放性使得人们获取信息的 ...

  2. 计算机在医学影像中的应用,计算机图像处理技术在医学影像中的进展与应用

    计算机图像处理技术在医学影像中的进展与应用 (4页) 本资源提供全文预览,点击全文预览即可全文预览,如果喜欢文档就下载吧,查找使用更方便哦! 4.9 积分 生物医学工程学杂志 J . Biou led ...

  3. 桌面中计算机作用,云桌面技术在计算机机房管理中的作用研究

    林朝晖 摘   要:对于探讨云桌面技术在计算机机房管理中作用,文章首先分析云桌面技术的内涵和应用优势,然后分析云桌面技术在计算机机房管理中的作用,包括:设计思路作用.系统虚拟化软件和软件服务云的作用. ...

  4. 计算机网络技术及实践中的应用,关于计算机网络技术及在实践中的应用.doc

    关于计算机网络技术及在实践中的应用.doc 关于计算机网络技术及在实践中的应用 摘要:随着信息时代的发展,作为其传输方式之一的计算机网络技术也逐渐发展起来,并很好地运用到了社会工作中去,带动着社会的发 ...

  5. 计算机在医学影像中的应用,计算机图像处理技术在医学影像中的进展与应用研究...

    计算机图像处理技术在医学影像中的进展与应用研究 摘 要:现在是网络时代,受网络快速发展的影响,也推动医疗行业的革新发展,为医院医疗检测提供了方便.计算机图像处理技术在医学领域应用广泛,医院里现代化的医 ...

  6. 计算机在水产养殖学中的应用,计算机图像处理技术在水产养殖业中的应用

    摘  要: 利用计算机图像处理技术在水产养殖业中实现对鱼类生长的监控. 关键词: 数字图像处理  水产养殖  Matlab 近年来,随着经济的发展及人们生活水平的日益提高,对水产品需求量也越来越大.因 ...

  7. 简述计算机视觉在各领域中的成功应用,计算机视觉技术在茶叶领域中的应用现状及展望...

    [1] 徐金玉. 展望中国茶业新形势[N]. 人民政协报, 2017-02-24(11). [2] 梅宇. 2016年中国茶业经济形势简报[J]. 茶世界, 2017(2): 14-18. [3] 潘 ...

  8. labview利用簇模拟汽车控制_在LabVIEW应用程序中何时应采用面向对象技术 (翻译)...

    在LabVIEW应用程序中何时应采用面向对象技术 (翻译) 在LabVIEW中应用面向对象编程技术并不是一件特别容易的事情,尤其是先期的学习成本很高,但是在开发大型.复杂的.长期维护的程序时,使用面向 ...

  9. 【视频课程】新能源汽车驱动与三电系统设计高级技术--系列课程

    [视频课程]新能源汽车驱动与三电系统设计高级技术–系列课程 新能源汽车区别于传统车最核心的技术是"三电(电驱动,电池,电控)",目前,新能源汽车所使用的控制系统大多是在传统汽车控制 ...

  10. 扫描电镜图片的Matlab分析,基于Matlab的图像增强与复原技术在SEM图像中的应

    0引  言 根据国内外的相关文献,研究和发展图像处理工具,改善图像质量是当今研究的热点.图像增强与复原是一种基本的图像处理技术.其按照特定的需要突出一幅图像中的某些信息或强化某些感兴趣的特征,将原来不 ...

最新文章

  1. TIOBE 8 月榜单:Groovy 和 Objective-C 重返前二十
  2. ASPxPopupControl出现前一次弹框页面解决方法
  3. c++ winpcap开发(2)
  4. 用c语言编写最大最小值_C语言学习教程,用C语言编写扫雷游戏
  5. 百度,在模仿和创新中成长
  6. Flutter学习 — 用占位符淡入淡出的显示图片
  7. 【Python实现】运输问题的表上作业法(二):利用位势法判断当前解的最优性
  8. 安装程序总是提示重启计算机,技巧| 安装西门子软件时提示重启电脑的解决办法...
  9. python:tushare 获取A股指数数据,并使用LSTM预测
  10. 转:这些道理不懂,你注定就是穷打工的命
  11. aria2+ariang+nginx linux 离线下载部署
  12. Python基础知识——函数的基本使用、函数的参数、名称空间与作用域、函数对象与闭包、 装饰器、迭代器、生成器与yield、函数递归、面向过程与函数式(map、reduce、filter)
  13. MOS管的finger和multiplier
  14. 《增长黑客》Sean Ellis epub+mobi+azw3
  15. 微前端项目实战及原理
  16. 【java 高并发编程之JUC】2w字带你JUC从入门到精通
  17. Vim中输入法与编码设置
  18. 在Macbook中安装破解版软件后出现“文件已损坏”的解决办法
  19. VS2019中使用C++初步实现winform界面
  20. Matlab转Python问题之二维数组单索引寻值

热门文章

  1. 阿甘修理机器人cd_剑网三遗失的美好奖励之阿甘
  2. win7系统电脑运行速度的提升方法
  3. 腾讯视频下载官方_腾讯视频评论在哪
  4. 跨平台低延迟的RTMP/RTSP直播播放器设计实现
  5. python英文字典小程序_python 小程序—三级菜单—循环和字典练习
  6. java中局部变量和成员变量
  7. 学java要背的单词_学习JAVA必背的8类常用单词
  8. 三角形外接球万能公式_秒杀三角形问题!!三角形分角线的几个重要结论及其应用...
  9. c++ 查找文件夹下最新创建的文件_云计算开发总结:搜索Linux文件和文件夹的方法...
  10. .network 中文文档_以太坊链下支付网络Raiden API中文文档