十年网站开发经验 + 多家企业客户 + 靠谱的建站团队
量身定制 + 运营维护+专业推广+无忧售后,网站问题一站解决
一、cp (复制文件或目录)
创新互联于2013年创立,先为南阳等服务建站,南阳等地企业,进行企业商务咨询服务。为南阳企业网站制作PC+手机+微官网三网同步一站式服务解决您的所有建站问题。cp 除了单纯的复制之外,还可以创建链接文件 ,比对两文件的新旧而予以更新。
cp (复制文件或目录)
cp [-adfilprsu] 来源文件(source) 目标文件(destination)
cp [options] source1 source2 source3 .... directory
选项与参数:
-a :相当于 -dr --preserve=all 的意思,(常用)
-d :若来源文件为链接文件的属性(link file),则复制链接文件属性而非文件本身;
-f :为强制(force)的意思,若目标文件已经存在且无法打开,则移除后再尝试一次;
-i :若目标文件(destination)已经存在时,在覆盖时会先询问动作的进行(常用)
-l :进行硬式链接(hard link)的链接文件创建,而非复制文件本身;
-p :连同文件的属性(权限、用户、时间)一起复制过去,而非使用默认属性(备份常用);
-r :递回持续复制,用于目录的复制行为;(常用)
-s :复制成为符号链接文件 (symbolic link),亦即“捷径”文件;
-u :destination 比 source 旧才更新 destination,或 destination 不存在的情况下才复制。
--preserve=all :除了 -p 的权限相关参数外,还加入 SELinux 的属性, links, xattr 等属性也复制。
注意:如果来源文件有两个以上,则最后一个目的文件一定要是“目录”才行。
复制(cp)这个指令是非常重要的,不同身份者执行这个指令会有不同的结果产生,尤其是那个-a, -p的选项, 对于不同身份来说,差异则非常的大,这主要原因是只有root用户有修改权限文件和目录的拥有者等权限,当于一些普通用户-a -p 参数可能不会有作用。
1、测试一:下面的测试首先以fromheart用户登录系统,在其家目录下建立一个文件test,然后切换到root用户,不带参数 带参数-p 查看复制后文件与源文件的属性差别
touch test
su -
pwd
cp /home/fromheart/test .
cp /home/fromheart/test testp
ls -al /home/fromheart/test test testp
通过下图可以发现,当带参数-p时,系统会保持文件原来的相关属性(所有者,相关用户或组的权限)
一般来说,我们如果去复制别人的数据 (当然,该文件用户必须要有 read 的权限才行)时, 总是希望复制到的数据最后是我们自己的,所以,在默认的条件中, cp 的来源文件与目标文件的权限是不同的,目标文件的拥有者通常会是指令操作者本身。
2、测试二:下面的测试,首先在当前登录用户fromheart家目录下分别建立 1/2、3目录,然后通过 cp -r 命令将1目录(含目录下的子目录2)复制到3目录下:
mkdir -p 1/2
mkdir 3
cp 1 3 (提示错误)
cp -r 1 3
ls -alR 1 3
注意: -r 是可以复制目录,但是,文件与目录的权限可能会被改变。 这一点在备份时要尤其注意,因为备份时用户很大可能需要保持源文件的属性。上图中,由于操作用户都是在其家目录下进行,所以权限没有变化。
测试三:建立链接文件 (symbolic link)
使用 -l 及 -s 都会创建所谓的链接文件(link file),但是这两种链接文件却有不一样的情况,其中个 -l 就是所谓的硬链接(hard link),至于 -s 则是软链接(symbolic link),相当于windows 下的快捷方式。
简单来说,软链接是一个“捷径”,这个捷径会链接到源文件上去!所以用户会看到文件名右侧会有个指向(->)的符号。
硬链接目标文件和源文件属性与权限完全一模一样,与尚未进行链接前的差异则是其属性第二栏的link数由1变成2了。同时,当源文件内容发生变化,硬链接目标文件也会发生变化。
mkdir sl ll(建立两个目录,sl 存放软链接源文件sl.txt,ll存放硬链接源文件ll.txt)
touch sl/sl.txt ll/ll.txt (在上述两个文件分别建立两个空文件sl.txt ll.txt)
cp -s sl/sl.txt sl.txts (通过cp -s命令,产生软链接文件sl.txts)
cp -l ll/ll.txt ll.txtl(通过cp -l命令,产生硬链接文件ll.txtl)
ls -ali ll/ll.txt ll.txtl (查看硬链接源文件、目标文件的inode等详细信息,发现两个文件的inode相同,文件连接数变成了2,注意对于存在于不同目录下的硬链接源目标文件,用户可以通过 find / -inode命令查找)
ls -ali sl/sl.txt sl.txts(软链接源目标文件完全相同)
测试三:当源文件比目标文件新时才复制过来
格式 :cp -u 源文件名 目标文件名(常用于备份操作)
测试四:复制链接文件的实际文件(不是链接文件,即不是快捷方式)
格式: cp -d 源文件名 目标文件名
所示。
范例五:一次将多个文件复制到目录下
格式:cp [options] source1 source2 source3 .... directory
可以将多个数据一次复制到同一个目录去!最后面一定是目录!
总之,由于 cp 有种种的文件属性与权限的特性,所以,在复制操作前,用户必须要清楚的了解到:是否需要完整的保留来源文件的信息?来源文件是否为链接文件 (symbolic link file)?来源文件是否为特殊的文件,例如 FIFO, socket 等?来源文件是否为目录?来源是多个文件?
二、rm (移除文件或目录)
格式|: rm [-fir] 文件或目录
选项与参数:
-f :就是 force 的意思,忽略不存在的文件,不会出现警告讯息;
-i :互动模式,在删除前会询问使用者是否动作
-r :递归删除啊!却将目录及目录下的所有内容都删除,这是非常危险的选项。
touch file1 file2
mkdir -p 1/2/3
ls
rm file1 file2
rm 1(提示1是一个目录,无法删除)
rm -p 1 (将目录1及目录1下的所有文件目录全部删除)
rm 还支持通配符操作,rm fil*
注意:当删除一个带有 - 开头的文件,如rm -aaaa,系统会提示删除不成功,这是因为系统会把-开始的文件名当成命令的操作选项,因此无法删除成功。
此时用户用用可以通过以下两种方法避开首位字符是 "-" 的方法:一是在文件目录名前加上“ ./ ”即可,rm ./-aaaa; 二是 rm -- -aaa-- 也可以。
touch ./-aaa ./-aaaa
ls
rm -aaa
rm -aaaa
rm ./-aaa
rm -- -aaaa
ls
三、mv (移动文件与目录,或更名)
格式:mv [-fiu] source destination
格式:mv [options] source1 source2 source3 .... directory
选项与参数:
-f :force 强制的意思,如果目标文件已经存在,不会询问而直接覆盖;
-i :若目标文件 (destination) 已经存在时,就会询问是否覆盖!
-u :若目标文件已经存在,且 source 比较新,才会更新 (update)
如果有多个来源文件或目录,则最后一个目标文件一定是“目录”,意思是说,将所有的数据移动到该目录的意思。
用户也可以通过rename进行更名操作,可以通过man rename查看相关操作。
四、取得路径的文件名称basename
五、取得路径的目录名称dirname
每个文件的完整文件名包含了前面的目录与最终的文件名,而每个文件名的长度都可以到达255 个字符耶! 那么用户怎么知道那个是文件名?那个是目录名?当然就是利用斜线 (/)来分辨啊! 其实,获取文件名或者是目录名称,一般的用途应该是在写程序的时候用来判断之用的。
basename /etc/sysconfig/network
network (获取最后的文件名)
dirname /etc/sysconfig/network
/etc/sysconfig (获取的变成目录名)