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 /home
total 20
drwxr-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 .tcshrc
drwxr-xr-x 2 root root 4096 Nov 17 19:01 XYJ
drwxr-xr-x 2 root root 4096 Nov 19 17:31 YXH
#这个时候你可以看到.开头的文件和目录文件(.)(..)
#文件夹是以深蓝色显示的
范例二:同上,不显示颜色,但在文件名末尾显示出该文件名代表的类型(type)
[root@VM_174_157_centos home]# ls -alF --color=never /home
total 20
drwxr-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 /home
total 20
drwxr-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/bashrc
cp: 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_hlink
lrwxrwxrwx 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 bashrc
lrwxrwxrwx 1 root root 6 Dec 5 17:20 bashrc_slink -> bashrc
-rw-r--r-- 1 root root 176 Dec 5 17:42 bashrc_slink_1
lrwxrwxrwx 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/etc
rmdir: etc: Directory not empty <==删不掉,因为这不是空的目录
[root@VM_174_157_centos tmp]# rm -r /tmp/etc
rm: 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]# ll
total 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/network
network
[root@VM_174_157_centos tmp]# dirname /etc/sysconfig/network
/etc/sysconfig