1.文件与目录的查看:Is
- ls [-aAdfFhilnrRst] 文件名或目录名称
- ls [ --color={never,auto,always} ]文件名或目录名称
- ls [ --full-time ]文件名或目录名称
选项与参数:
- -a:全部的文件,连同隐藏文件(开头为 .的文件)一起列出来(常用);
- -A:全部的文件,连同隐藏文件,但不包括 . 与 .. 这两个目录;
- -d:仅列出目录本身,而不是列出目录内的文件数据(常用);
- -f:直接列出结果,而不进行排序(ls默认会以文件名排序);
- -F:根据文件、目录等信息,给予附加数据结构,例如: *:代表可执行文件;/:代表目录;=:代表socket 文件;|:代表FIFO文件;
- -h:将文件容量以人类较易读的方式(例如GB、KB等)列出来;
- -i:列出inode 号码;
- -l:详细信息显示,包含文件的属性与权限等数据:(常用);
- -n:列出UTD与GID而非使用者与用户组的名称(UID与GID会在账号管理提到)
- -r:将排序结果反向输出,例如:原本文件名由小到大,反向则为由大到小;
- -R:连同子目录内容一起列出来,等于该目录下的所有文件都会显示出来;
- -S:以文件容量大小排序,而不是用文件名排序;
- -t:依时间排序,而不是用文件名。
- -color=never :不要依据文件特性给予颜色显示;
- --color=always:显示颜色;
- --color=auto:让系统自行依据设置来判断是否给予颜色;
- --full-time :以完整时间模式(包含年。月、日、时。分) 输出;
- --time-(atime,ctime):输出acceas 时间或改变权限属性时间(ctame )而非内容修改时间(nodification time
在Linux系统当中,这个Is命令可能是最常被执行的吧!
因为我们随时都要知道文件或是目录的相关信息,不过,我们Linux的文件所记录的信息实在是太多了,Is没有需要全部都列出来,所以,当你只执行Is时,默认显示的只有:非隐藏文件的文件名、以文件名进行排序及文件名代表的颜色显示如此而已。
举例来说,你执行【Is /etc】之后,只有经过排序的文件名,并以蓝色显示目录及白色显示一般文件,如此而已。
那如果我还想要加入其他的显示信息时,可以加入上面提到的那些有用的选项,举例来说,我们之前一直用到的-l这个显示详细信息,以及将隐藏文件也一起列示出来的-a选项等。
下面则是一些常用的范例,实际试做看看:
范例一:将家目录下的所有文件列出来(含属性与隐藏文件)
#这个时候你会看到以 . 为开头的几个文件,以及目录文件(.)、(..),不过,目录文件文件名都是以深蓝色显示,有点不容易看清楚.范例二:承上题,不显示颜色、但显示出该文件名代表的类型(type)
范例三:完整的显示文件的修改时间
#请仔细看,上面的【时间】栏位变了。变成较为完整的格式。一般来说,ls-al仅列出目前短格式的时间。有时不会列出年份,借由--full-time可以查到比较正常的完整时间格式
其实 Is的用法还有很多,包括查看文件inode号码的Is -i选项,以及用来进行文件排序的-S选项,还有用来查看不同时间的操作的--time=atime等选项。而这些选项的存在都是因为Linux文件系统记录了很多有用的信息的缘故。
那么Linux的文件系统中,这些与权限、属性有关的数据放在哪里?放在inode 里面。
无论如何Is最常被使用到的功能还是那个-l的选项,为此很多Linux发行版在默认的情况中,已经将ll(L的小写)设置成为Is-I的意思。其实,那个功能是Bash shell的alias功能,也就是说,我们直接输入ll就等于是输入Is-l。
2.复制文件或目录:cp
cp的主要用法如下:
- cp [options] sourcel source2 source3
- cp [-adfilprsu] 源文件(source)目标文件(destination)
选项与参数:
- -a:相当于-dr --preserve=all的意思,至于dr请参考下列说明(常用);
- -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,有的身份为一般账号在我这里用zs_108这个账号,练习时请特别注意身份的差别。好,开始来做复制的练习与观察:
范例一:用root 身份,将家目录下的.bashrc复制到/tmp 下,并更名为bashrc.
重复作两次操作,由丁/tmp 下面已经存在 bashrc
加上-i选项后,则在覆盖前会询问使用者是否确定,可以按下n或y来二次确认。n不覆盖,y为覆盖.范例二:切换目录到/tmp,并将/var/log/wtmp复制到/tmp且观察属性。
注意:想要复制到目前的目录,最后的.不要忘。注意上面的特殊字体,在不加任何选项的情况下,文件的某些属性/权限会改变。
这是个很重要的特性,要注意,还有,连文件建立的时间也不一样了。那如果你想要将文件的所有特性都一起复制过来该怎么办?可以加上-a,如下所示:
#了解了吧!整个数据特性完全一模一样。真是不赖,这就是-a的特性。
这个 cp的功能很多,由于我们常常会进行一些数据的复制,所以也会常常用到这个命令。
一般来说,我们如果去复制别人的数据(当然,该文件你必须要有read的权限才行)时,总是希望复制到的数据最后是我们自己的,所以,在默认的条件中,cp的源文件与目标文件的权限是不同的,目标文件的拥有者通常会是命令操作者本身。
举例来说,上面的范例二中由于我是root的身份,因此复制过来的文件拥有者与用户组就改变成了root所有。
由于具有这个特性,因此当我们在进行备份的时候,某些需要特别注意的特殊权限文件,例如密码文件(/etc/shadow)以及一些配置文件,就不能直接以cp来复制,而必须要加上-a或是-p等可以完整复制文件权限的选项才行。
另外,如果你想要复制文件给其他的用户,也必须要注意到文件的权限,包含读、写、执行以及文件拥有者等),否则,其他人还是无法针对你给予的文件进行自定义的操作
范例三:复制/etc/这个目录下的所有内容到/tmp下面。
如果是目录的话使用cp是不能复制的,得加上-r选项才行
不过-r是可以复制目录,但是,文件与目录的权限可能会被改变。
所以,也可以利用【cp -a /etc /tmp】来执行命令,尤其是在备份的时候
范例四:将范例一复制的bashrc 建立一个符号链接文件(symbolic 1ink).
范例四可有趣了,使用-l及-s都会建立所谓的链接文件(link file),但是这两种链接文件却有不一样的情况。这是怎么一回事?
那个-l就是所谓的硬链接(hard link),至于-s则是符号链接(symbolic link),简单来说,bashrc_slink是一个快捷方式,这个快捷方式会链接到bashrc。所以你会看到文件名右侧会有个指向(->)的符号。
至于bashrc_hlink文件与bashrc的属性与权限完全一模一样,与尚未进行链接前的差异则是第二栏的link数由1变成了2。
范例五:若~/.bashrc比/tmp/bashrc新,才复制过来.这个-u的特性,是在目标文件与源文件有差异时,才会复制的。所以,常被用于备份的工作当中
范例六;将范例四造成的bashrc_slink复制成为bashrc_slink_1和bashrc_slink_2
这个例子也是很有趣。原本复制的是链接文件,但是却将链接文件的实际文件复制过来了。也就是说,如果没有加上任何选项时,cp复制的是原始文件,而非链接文件的属性。
若要复制链接文件的属性,就得要使用-d的选项了,如bashrc_slink_2所示。
范例七:将家目录的.bashrc及.bash_history复制到/tmp下面。
可以将多个文件一次复制到同一个目录,最后面一定是目录
范例八,你能否使用zs_108的身份,完整地复制/var/log/wtmp文件到/tmp下面,并更名为dmtsai_wtmp?
答:实际做的结果如下:
由于zs_108的身份并不能随意修改文件的拥有者与用户组,因此虽然能够复制wtmp的相关权限与时间等属性,但是与拥有者、用户组相关,原本zs_108身份无法进行的操作,即使加上-a选项,也是无法完成完整权限的复制。而root账号下面轻松做到
总之,由于cp有种种的文件属性与权限的特性,所以,在复制时,你必须要清楚地了解到:
- 是否需要完整的保留源文件的信息?
- 源文件是否为符号链接文件(symbolic link file)?
- 源文件是否为特殊的文件,例如FIFO、socket等?
- 源文件是否为目录?
3.rm(删除文件或目录)
- rm[-fir]文件或自录
选项与参数:
- -f:就是 force的意思,忽略不存在的文件,不会出现警告信息。
- -I:交互模式,在删除前会询问使用者是否操作。
- -r:递归删除,最常用于目录的删除,这是非常危险的选项。
范例一:将刚刚在cp的范例中建立的bashrc删除掉、
#如果加上-i的选项就会主动询问,避免你删除到错误的文件名。
范例二:通过通配符*的帮忙,将/tmp下面开头为bashrc的文件名通通删除
注意那个星号,代表的是0到无穷多个任意字符,很好用的东西。
范例三:将cp 范例中所建立的/tmp/etc/这个目录删除掉
删不掉因为不是空目录
我们就得使用
……(中间省略)……
#因为身份是root,默认已经加入了-i的选项,所以你要一直按y才会删除。
如果不想要继续按y,可以按ctrl+c来终止这个删除工作
这是一种保护的操作,如果确定要删除掉此目录而不要询问,可以在命令前加上反斜线,可以忽略掉alias的指定选项,
#拜托,这个范例很可怕,你不要删错了,删除/etc系统会挂掉。
范例四:删除一个带有-开头的文件。
文件因为”-“是选项嘛,所以系统误判了。
我们的bash也给我们提了建议,我们来试试看
这是删除的命令(remove),要注意的是,通常在Linux系统下,为了怕文件被root误删,所以很多Linux发行版都已经默认加入了-i这个选项。
而如果要连目录下的东西都一起删除的话,例如子目录里面还有子目录时,那就要使用-r这个选项。不过,使用rm -r这个命令之前,请千万注意了,因为该目录或文件肯定会被root删除。因为系统不会再次询问你是否要删除,所以那是个超级严重的命令,得特别注意。
不过,如果你确定该目录不要了,那么使用rm-r来递归删除是不错的方式。
另外,范例四也是很有趣的例子,文件名最好不要使用“-"号开头,因为“-“后面接的是选项,因此,单纯的使用【rm -aaa-】系统的命令就会误判,那如果使用后面会谈到的正则表达式时,还是会出问题。所以,只能用避过首位字符是“-”的方法,就是加上本目录“./”即可。如果man rm的话,其实还有一种方法,那就是【rm -- -aaa-】也可以。
4.mv(移动文件与目录,或重命名)
- mv [-fiu] source destination
- mv [options] source1 source2 ... directory
选项与参数:
- -f:force 强制的意思,如果目标文件已经存在,不会询问而直接覆盖。
- -i:若目标文件(destination)已经存在时,就会询问是否覆盖。
- -u:若目标文件已经存在,且source 比较新,才会更新(update)
.范例一:复制一文件,建立一目录,将文件移动到目录中。
将某个文件移动到某个目录去,就是这样做。
范例二:将刚刚的目录名称更名为mvtest2.
这样就重命名了。
#其实在Linux下面还有个有趣的命令,名称为rename,
#该命令专职进行多个文件名的同时重命名,并非针对单一文件名修改,与mv不同,请man rename.范例三:再建立两个文件,再全部移动到/tmp/mvtest2当中。
注意到这边,如果有多个源文件或目录,则最后一个目标文件一定是【目录】
意思是说,将所有的文件移动到该目录的意思。
这是移动(move)的意思,当你要移动文件或目录的时候,这个命令就很重要。
同样,你也可以使用-u(update)来测试新旧文件,看看是否需要移动。
另外一个用途就是修改文件名,我们可以很轻易地使用mv 来修改一个文件的文件名。
不过,在Linux中有个rename命令,可以用来更改大量文件的文件名,你可以利用man rename来查看一下,也是挺有趣的命令。