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

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编写脚本尤其需要注意。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/564174.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C++ set

set 是关联容器的一种,是排序好的集合(元素已经进行了排序)。set 和 multiset 类似,它和 multiset 的差别在于 set 中不能有重复的元素。multiset 的成员函数 set 中也都有。 不能直接修改 set 容器中元素的值。因为元素被修改后…

linux内核实现ipsec,IP XFRM配置示例:利用linux kernel自带的IPSec实现,手动配置IPSec...

1、拓扑192.168.18.101 <> 192.168.18.1022、配置192.168.18.101ip xfrm state add src 192.168.18.101 dst 192.168.18.102 proto esp spi 0x00000301 mode tunnel auth md5 0x96358c90783bbfa3d7b196ceabe0536b enc des3_ede 0xf6ddb555acfd9d77b03ea3843f2653255afe8e…

linux 内核 82540网卡,Linux网卡as4.2 编译安装及配置准备

Linux网卡as4.2 编译安装及配置准备[日期&#xff1a;2008-03-28]来源&#xff1a;Linux公社作者&#xff1a;Linux整理[字体&#xff1a;大 中 小]确定make gcc kernel-devel包必须安装,没安装的话需要手动安装查看是否安装方法rpm -aq|gccrpm -aq|makerpm -aq|kernel-devel解…

C++ 容器适配器

STL 中的容器适配器有 stack、queue、priority_queue 三种。它们都是在顺序容器的基础上实现的&#xff0c;屏蔽了顺序容器的一部分功能&#xff0c;突出或增加了另外一些功能。 容器适配器都有以下三个成员函数&#xff1a; push&#xff1a;添加一个元素。top&#xff1a;返…

linux管理进程和计划任务,Linux进程和计划任务管理

本章结构#查看进程#控制进程#at一次性任务设置#crontab周期性任务设置程序和进程的关系#程序保存在硬盘、光盘等介质中的可执行代码和数据静态保存的代码#进程在cpu及内存中运行的程序代码动态执行的代码父、子进程&#xff1a;每个进程可以创建一个或多个进程查看进程ps#ps命令…

C++ stack

stack 是容器适配器的一种。要使用 stack&#xff0c;必须包含头文件 。 stack就是“栈”。栈是一种后进先出的元素序列&#xff0c;访问和删除都只能对栈顶的元素&#xff08;即最后一个被加入栈的元素&#xff09;进行&#xff0c;并且元素也只能被添加到栈顶。栈内的元素不…

C++ queue和priority_queue

queue 和 priority_queue 都是容器适配器&#xff0c;要使用它们&#xff0c;必须包含头文件 。 queue queue 就是“队列”。队列是先进先出的&#xff0c;和排队类似。队头的访问和删除操作只能在队头进行&#xff0c;添加操作只能在队尾进行。不能访问队列中间的元素。 qu…

less linux命令,less 命令用法详解

less 在 Linux 中用来查看文件&#xff0c;它可以以分页的方式显示文件内容。目前和tail 是用来查看文件的常用命令命令格式less [参数] 文件1、使用示例less a.txt用来查看文件按f 或 space 向下翻一页按b向前翻一页其实很好记f即forward 向前b即backward 向后关键最强大的一点…

STL算法分类

STL 中&#xff0c;算法就是函数模板。STL 中的算法大多数是用来对容器进行操作的&#xff0c;如排序、 查找等。大部分算法都是在头文件 中定义的&#xff0c;还有些算法用于数值处理&#xff0c;定义在头文件 中。 STL 中的算法的分类方法。 1 . 不变序列算法。 2 . 变值算法…

linux系统时间代表,Linux上有两种时间,一种是硬件时间,一种是系统时间

date 系统时间clock/hwclock 硬件时钟cal 日历date打印或设置系统日期或时间&#xff0c;以给定格式显示或设置系统时间%a显示周%A 完整显示周%b显示月份%B 完整显示月%c e.g.,Thu Mar 3 23:05:25 2005%C 显示世纪%d显示几日%D …

linux下软件包清理,Linux运维知识:如何清理Linux系统中的孤立、无用的软件包

本文主要向大家介绍了Linux运维知识的如何清理Linux系统中的孤立、无用的软件包&#xff0c;通过具体的内容向大家展现&#xff0c;希望对的大家学习Linux运维知识有所帮助。在Linux下安装软件&#xff0c;通常会自动安装一些依赖包或库。在你卸载某个软件后&#xff0c;这个软…

linux 多个定时器,timer: 一个Linux下的超级精简的多重定时器:可实现成千上万个定时任务,定时精度可达纳秒级别,且同一时间点可添加不同的任务!适用于云后台服务和嵌入式等各种环境。...

MT_Timer(MT译为Multiple或Multi)一、介绍一个Linux下的超级简洁的定时器&#xff1a;利用epoll机制和timerfd新特性实现的多重、多用、多个定时任务实现。只需要使用TIMER_CREATE()接口创建一个定时器实体&#xff0c;即可向其添加成千上万个定时任务&#xff0c;定时任务可达…

C++ bitset类

bitset 模板类由若干个位&#xff08;bit&#xff09;组成&#xff0c;它提供一些成员函数&#xff0c;使程序员不必通过位运算就能很方便地访问、修改其中的任意一位。bitset 模板类在头文件 中定义如下&#xff1a; template <size_t N> class bitset {... };size_t 可…

red flag linux指定域名,Red Flag Server 4.1 系统管理手册(适用桌面linux4.1) 6

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼第3章 文件系统管理 (三)--------------------------------------------------------------------------------3.6 LVM逻辑卷管理LVM 是 Logical Volume Manager 的简写&#xff0c;它为计算机提供了更高层次的磁盘存储解决方案&am…

什么是计算机文件

内存中存放的数据在计算机关机后就会消失。要长久保存数据&#xff0c;就要使用硬盘、光盘、U 盘等设备。为了便于数据的管理和检索&#xff0c;引入了“文件”的概念。 一篇文章、一段视频、一个可执行程序&#xff0c;都可以被保存为一个文件&#xff0c;并赋予一个文件名。…

linux下阻塞的系统调用,Linux下文件的阻塞与非阻塞对部分系统调用的影响

1.基本概念所谓的阻塞&#xff0c;即内核在对文件操作I/O系统调用时&#xff0c;如果条件不满足(可能需要产生I/O)&#xff0c;则内核会将该进程挂起。非阻塞则是发现条件不满足就会立即返回。此外需要注意的是非阻塞并不是轮询&#xff0c;不然就和阻塞没多大区别了&#xff0…

C++文件类

C 标准类库中有三个类可以用于文件操作&#xff0c;它们统称为文件流类。这三个类是&#xff1a; ifstream&#xff1a;用于从文件中读取数据。ofstream&#xff1a;用于向文件中写人数据。fstream&#xff1a;既可用于从文件中读取数据&#xff0c;又可用于 向文件中写人数据。…

window10内核Linux,windows 10中发布完整的Linux内核

5月8日消息&#xff1a; 近年来&#xff0c;微软对Linux开发者社区的支持令许多人感到惊讶&#xff0c;包括将诸如Bash shell之类的东西引入到Windows&#xff0c;或者在Windows 10中支持原生OpenSSH&#xff0c;甚至包括Windows应用商店上架了Ubuntu、SUSE Linux和Fedora。现在…

C++ open 打开文件

在对文件进行读写操作之前&#xff0c;先要打开文件。打开文件有以下两个目的&#xff1a; 1 . 通过指定文件名&#xff0c;建立起文件和文件流对象的关联&#xff0c;以后要对文件进行操作时&#xff0c;就可以通过与之关联的流对象来进行。 2 . 指明文件的使用方式。使用方…

c语言窗口炸弹代码,C语言实现数字炸弹小游戏

本文实例为大家分享了C语言实现数字炸弹小游戏的具体代码&#xff0c;供大家参考&#xff0c;具体内容如下使用的是C语言# 内容#include#includeint main(){//变量char c_TheRequest 1;//开始界面的字符int in_Deltar 1,in_EnteredNumber,in_Sig;//游戏中输入数字及其判定所需…