Linux学习(5)--文件与目录管理

来源:互联网 发布:php企业站源码 编辑:程序博客网 时间:2024/06/14 07:16

ls 命令

具体的参数可以通过man page去查看,这里只着重说几个常用的参数

[root@VM_174_157_centos ~]# ls [参数] 目录名称[root@VM_174_157_centos ~]# ls [--color={never,auto,always}] 目录名称[root@VM_174_157_centos ~]# ls [--full-time] 目录名称参数:-a :全部的文件,连同隐藏文件(开头为.的文件)一起列出来-d :仅列出目录本身,而不是列出目录内的文件数据-l :列出长数据串,包含文件的属性与权限等数据

在Linux中,ls这个命令可能是最常用的了。当我们执行ls时,默认显示的只有:非隐藏文件的文件名、以文件名进行排序及文件名代表的颜色显示。以下给出几种范例:

范例一:显示主文件夹下的所有文件(含属性与隐藏文件)[root@VM_174_157_centos home]# ls -al /hometotal 20drwxr-xr-x.  4 root root 4096 Nov 19 17:26 .dr-xr-xr-x. 23 root root 4096 Nov 30 20:36 ..-rw-r--r--.  1 root root  129 Dec  4  2004 .tcshrcdrwxr-xr-x   2 root root 4096 Nov 17 19:01 XYJdrwxr-xr-x   2 root root 4096 Nov 19 17:31 YXH#这个时候你可以看到.开头的文件和目录文件(.)(..)#文件夹是以深蓝色显示的范例二:同上,不显示颜色,但在文件名末尾显示出该文件名代表的类型(type)[root@VM_174_157_centos home]# ls -alF --color=never /hometotal 20drwxr-xr-x.  4 root root 4096 Nov 19 17:26 ./dr-xr-xr-x. 23 root root 4096 Nov 30 20:39 ../drwxr-xr-x   2 root root 4096 Nov 17 19:01 XYJ/drwxr-xr-x   2 root root 4096 Nov 19 17:31 YXH/范例三:显示文件的完整修改时间 *(modification time)[root@VM_174_157_centos home]# ls -alF --color=never /hometotal 20drwxr-xr-x.  4 root root 4096 Nov 19 17:26 ./dr-xr-xr-x. 23 root root 4096 Nov 30 20:39 ../drwxr-xr-x   2 root root 4096 Nov 17 19:01 XYJ/drwxr-xr-x   2 root root 4096 Nov 19 17:31 YXH/#时间字段变成了较为完整的格式,即使几年前的也可以是完整的#ls -al仅列出短格式时间

无论如何,ls最常被使用到的功能还是那个 -l 的选项,为此,很多 distribution 在预设的情况中,已经将 ll 设定为ls -l的意思了!这个功能也就是 Bash Shell 的alias功能,在后面的博文中会详细说到。

复制、删除和移动(cp、rm、mv)

要复制文件,可以使用cp(copy)这个命令,不过除了单纯的复制,它还可以建立连结档(快捷方式),比对两个文件的新旧并予以更新,以及复制整个目录等等功能。

移动目录和文件,则使用mv(move),这个命令也可以拿来做改名(rename)的操作。至于移除rm(remove)就是删除了。

1. cp(复制文件或目录)

[root@VM_174_157_centos home]# cp [-参数] 源文件(source) 目标文件(destination)[root@VM_174_157_centos home]# cp [参数] source1 source2 source3 ... directory选项与参数:-a :相对于 -pdr 的意思,pdr参照下列说明-d :若来源文件为链接文件的属性(link file),则复制链接文件属性而非文件本身-i :若目标文件(destination)已经存在时,在覆盖时会先询问动作的进行-p :连同档案的属性一起复制过去,而非使用默认属性-r :递归持续复制,用于文件夹的复制行为

cp命令是非常重要的,不同身份执行会有不同的结果产生,尤其是那个-a,-p的选项,对于不同身份来说,差异非常大!在下面的练习中,我会使用root和YXH(普通账户)两个身份,请注意差异!

范例1:用root身份,将根目录下的.bashrc复制到/tmp下,并更名为bashrc[root@VM_174_157_centos ~]# cp ~/.bashrc /tmp/bashrc[root@VM_174_157_centos ~]# cp -i ~/.bashrc /tmp/bashrccp: overwrite `/tmp/bashrc'? n#重复两次动作,在加上-i后,会询问是否确定,可以按下n或者y来确认范例2:转到/tmp,并将/var/log/wtmp复制到/tmp且观察属性[root@VM_174_157_centos ~]# cd /tmp/[root@VM_174_157_centos tmp]# cp /var/log/wtmp .   <==复制到当前目录,不要忘了[root@VM_174_157_centos tmp]# ls -l /var/log/wtmp wtmp-rw-rw-r--. 1 root utmp 48768 Dec  5 16:52 /var/log/wtmp-rw-r--r--  1 root root 48768 Dec  5 16:53 wtmp#在不加任何选项的情况下,文件的某些属性/权限会改变#而且注意到,脸文件的建立时间也不一样了,但是如果我们想要将文件的所有#特性一起都复制过来该怎么办?可以加上-a,如下所示:[root@VM_174_157_centos tmp]# cp -a /var/log/wtmp wtmp_2[root@VM_174_157_centos tmp]# ls -l /var/log/wtmp wtmp_2-rw-rw-r--. 1 root utmp 48768 Dec  5 16:52 /var/log/wtmp-rw-rw-r--. 1 root utmp 48768 Dec  5 16:52 wtmp_2#可以看到,文件属性完全一模一样,这就是-a

一般来说,我们如果去复制别人的数据(当然首先你需要read权限)时,总是希望复制到的数据最后是我们自己的,所以,在预设的默认条件中,cp的来源文件与目标文件的权限是不同的,目标文件的拥有者通常是指令操作者本身。在上面的范例2中,由于使用的是root的身份,因此复制过来的档案拥有者与群组就改变成为root所有了。

由于具有这个特性,因此当我们在备份某些需要特别注意的特殊权限档案,例如密码文件以及一些配置文件,就不能直接以 cp 来复制,而必须加上-a或者-p等等可以完全复制的命令。

范例3:复制/etc/这个目录下所有的内容到/tmp下[root@VM_174_157_centos tmp]# cp /etc/ /tmp/cp: omitting directory `/etc/'        <==如果是目录则不能直接复制,要加上-r的选项[root@VM_174_157_centos tmp]# cp -r /etc/ /tmp/#-r 可以复制复制目录,但是,权限可能会被改变,所以也可以利用-a来复制范例4:将范例1复制的bashrc建立一个软链接(symbolic link)[root@VM_174_157_centos tmp]# ls -l bashrc-rw-r--r-- 1 root root 176 Dec  4 13:34 bashrc      <==先观察一下文件情况[root@VM_174_157_centos tmp]# cp -s bashrc bashrc_slink[root@VM_174_157_centos tmp]# cp -l bashrc bashrc_hlink[root@VM_174_157_centos tmp]# ls -l bashrc*-rw-r--r-- 2 root root 176 Dec  4 13:34 bashrc     <==与源文件不太一样了-rw-r--r-- 2 root root 176 Dec  4 13:34 bashrc_hlinklrwxrwxrwx 1 root root   6 Dec  5 17:20 bashrc_slink -> bashrc

范例4可有趣了,使用 -l 和 -s 都会建立所谓的链接文件(link file),但是这两种链接文件却有不一样的情况,这是怎么一回事?-l 就是所谓的硬链接(hard link),至于 -s 则是软链接(symbolic link),简单来说,bashrc_slink是一个快捷方式,这个快捷方式会连结到bashrc去,所以有一个指向(->)符号

至于bashrc_hlink文件与bashrc的属性与权限完全一模一样,与尚未进行连结前的差异则是第二栏的link数变为2了!这里先不做介绍,后面的文件系统再细谈。

范例5:若~/.bashrc比/tmp/bashrc新才复制过来[root@VM_174_157_centos tmp]# cp -u ~/.bashrc /tmp/bashrc#这个-u的特性,是在目标文件与源文件有差异时,才会复制的,常被用于备份范例6:将范例4造成的bashrc_slink复制成为bashrc_slink_1和bashrc_slink_2[root@VM_174_157_centos tmp]# cp bashrc_slink bashrc_slink_1[root@VM_174_157_centos tmp]# cp -d bashrc_slink bashrc_slink_2[root@VM_174_157_centos tmp]# ls -l bashrc bashrc_slink*-rw-r--r-- 2 root root 176 Dec  4 13:34 bashrclrwxrwxrwx 1 root root   6 Dec  5 17:20 bashrc_slink -> bashrc-rw-r--r-- 1 root root 176 Dec  5 17:42 bashrc_slink_1lrwxrwxrwx 1 root root   6 Dec  5 17:42 bashrc_slink_2 -> bashrc#这个例子也很有趣,本来复制的是链接文件,但是却将链接文件的实际文件复制过来了#也就是说,如果没有加上任何属性的话,cp 复制的是源文件,而非链接文件的属性#若要复制链接文件的属性,就要使用-d的选项了,如bashrc_slink_2所示范例7:将根目录的.bashrc.bash_history复制到/tmp下[root@VM_174_157_centos tmp]# cp ~/.bashrc ~/.bash_history /tmp#可以将多个数据一次复制到同一目录去,最后面一定是目标目录

那么我们是否能否使用YXH身份,完整的复制/var/log/wtmp文件到/tmp下,并更名为YXH_wtmp

-bash-4.1$ cp -a /var/log/wtmp /tmp/YXH_wtmp-bash-4.1$ ls -l /var/log/wtmp /tmp/YXH_wtmp -rw-rw-r--  1 YXH  YXH  48768 Dec  5 16:52 /tmp/YXH_wtmp-rw-rw-r--. 1 root utmp 48768 Dec  5 16:52 /var/log/wtmp#由于YXH的身份并不能随意修改档案的拥有者与群组,因此虽然能够复制wtmp的相关权限与时间等#但是与拥有者、群组相关的,原本YXH身份无法进行的操作,及时加上-a选项,也是不行的

总之,在复制之前,我们必须要清楚得知道:

  • 是否需要完整的保留源文件的信息
  • 源文件是否为链接文件(symbolic link file)
  • 源文件是否为特殊权限文件,例如FIFO,socket等
  • 源文件是否为文件夹

2.rm(移除档案或者目录)

[root@VM_174_157_centos ~]# rm [-fir] 档案或者目录选项与参数:-f:就是force的意思,忽略不存在的档案,不会出现警告讯息-i:互动模式,在删除前会询问使用者是否动作-r:递归删除!最常用在目录的删除!这是非常危险的选项!范例1:将/tmp中的一个文件夹删除掉[root@VM_174_157_centos ~]# cd /tmp[root@VM_174_157_centos tmp]# rm -i bashrc rm: remove regular file 'bashrc'? y#如果加上-i的选项就会主动询问,避免删除到错误的文件名!范例2:通过通配符*的帮忙,将/tmp底下开头为bashrc的文件名通通删除:[root@VM_174_157_centos tmp]# rm -i bashrc*#注意那个星号,代表的是 0 到无穷多个任意字符!范例3:将/tmp/etc这个目录删掉![root@VM_174_157_centos tmp]# rmdir /tmp/etcrmdir: etc: Directory not empty  <==删不掉,因为这不是空的目录[root@VM_174_157_centos tmp]# rm -r /tmp/etcrm: descend into directory '/tmp/etc'? y...(中间省略)...#因为身份是root,预设已经加入了-i的选项,所以你需要一直按y才会删除!#如果不想要继续按y,可以按下Ctrl+C来强制结束#删除的时候,注意目录为/tmp/etc,千万不要输入错误为/etc,否则你只能重装系统了#这是一种保护的动作,如果确定要删除掉此目录而不要询问,可以这样做:[root@VM_174_157_centos tmp]# \rm -r /temp/etc#在指令前加上反斜杠,可以忽略掉alias的指定选项,至于alias我们在bash再谈!范例4:删除一个开头带有 - 的档案[root@VM_174_157_centos ~]# cd /tmp/[root@VM_174_157_centos tmp]# touch ./-aaa-    <==touch这个指令可以建立空档案![root@VM_174_157_centos tmp]# ll total 12-rw-r--r-- 1 root root    0 Feb 19 10:58 -aaa-    <==档案大小为0,所以是空的-rw-r--r-- 1 root root 1697 Feb 19 10:45 cvm_init.log-rw-r--r-- 1 root root  140 Feb 19 10:45 net_affinity.log-rw-r--r-- 1 root root    0 Feb 19 10:45 sagent.pid-rw-r--r-- 1 root root  154 Feb 19 10:45 setRps.log[root@VM_174_157_centos tmp]# rm -aaa-           <==因为“-”是选项嘛,所以系统误判了rm: invalid option -- 'a'Try 'rm ./-aaa-' to remove the file '-aaa-'.Try 'rm --help' for more information.[root@VM_174_157_centos tmp]# rm ./-aaa-rm: remove regular empty file './-aaa-'? y

通常在Linux系统下,为了怕档案被误杀,所以很多 distributions 都已经默认加入 -i 这个选项了!使用rm -r这个指令的时候一定要千万注意,因为该目录一定会被root杀掉,所以系统不会再问你!我自己就曾经不小心删掉了/etc,最后只能重装系统!

另外,范例4是一个很有趣的例子,我们在之前就谈过,档案名最好不要用“-”开头,因为“-”后面接的是选项,因此,单纯的使用rm -aaa-系统的指令就会误判!所以,只能用避过首位字符是“-”的方法!就是加上本目录“./”即可!但是man rm的话,可以发现其实rm – -aaa-也可以!

3.mv(移动档案与目录,或更名)

[root@VM_174_157_centos tmp]# mv [-fiu] source destination[root@VM_174_157_centos tmp]# mv [options] source1 source2 source3 ... directory选项与参数:-f:force强制的意思,如果目标档案已经存在,不会询问而直接覆盖-i:若目标档案(destination)已经存在,就会询问是否覆盖-u:若目标档案已经存在,且source比较新,才会更新(updata)范例1:复制一档案,建立一目录,将档案移动到目录中[root@VM_174_157_centos ~]# cd /tmp/[root@VM_174_157_centos tmp]# cp ~/.bashrc bashrc[root@VM_174_157_centos tmp]# mkdir mvtest[root@VM_174_157_centos tmp]# mv bashrc mvtest #将某个档案移动到某个目录中去,就是这样做范例2:将刚刚的目录名称更名为mvtest2[root@VM_174_157_centos tmp]# mv mvtest mvtest2#其实在Linux下还有个有趣的命令,叫做rename#改命令专职进行多个文件名的同时更名,并非针对单一文件名变更,与mv不同#有兴趣的可以man rename范例3:再建立两个档案,再全部移动到/tmp/mvtest2当中[root@VM_174_157_centos tmp]# cp ~/.bashrc bashrc1[root@VM_174_157_centos tmp]# cp ~/.bashrc bashrc2[root@VM_174_157_centos tmp]# mv bashrc1 bashrc2 mvtest2 [root@VM_174_157_centos tmp]# cd mvtest2/[root@VM_174_157_centos mvtest2]# lltotal 12-rw-r--r-- 1 root root 176 Feb 19 14:28 bashrc-rw-r--r-- 1 root root 176 Feb 19 14:32 bashrc1-rw-r--r-- 1 root root 176 Feb 19 14:32 bashrc2#注意到如果有多个来源或目录,则最后一个目标文件一定是文件夹#意思就是说,将所有的数据移动到该文件夹的意思

我们可以使用-u(updata)来测试新旧文件,看看是否需要移动!另外的用处就是我们可以轻易的使用mv来变更一个档案的名字。当然你也可以使用rename指令,有需要的可以man rename。

4.取得路径的文件名与目录名称

我们前面介绍的完整文件名(包括目录名称与文件名)当中提到,完整的文件名最长可以达到4096个字符。那么我们怎么知道哪个是文件名?那个是目录名?就是利用斜线(/)来分辨。其实,取得文件名或者是目录名称,一般的用途应该是写程序的时候用来判断的。我们只简单得说说 basename 与 dirname 的用途!

[root@VM_174_157_centos tmp]# basename /etc/sysconfig/networknetwork[root@VM_174_157_centos tmp]# dirname /etc/sysconfig/network/etc/sysconfig
0 0
原创粉丝点击