Linux

[root@study ~]# chgrp [-R] dirname/filename …
选项与参数: -R : 进行递回(recursive)的持续变更,亦即连同次目录下的所有文件、目录 都更新成为这个群组之意。常常用在变更某一目录内所有的文件之情况。

范例:[root@study ~]# chgrp users initial-setup-ks.cfg
[root@study ~]# ls -l
-rw-r–r--. 1 root users 1864 May 4 18:01 initial-setup-ks.cfg
[root@study ~]# chgrp testing initial-setup-ks.cfg
chgrp: invalid group: `testing’ <== 发生错误讯息啰~找不到这个群组~

事实上在Linux服务器中,RAM 内存是越大越好,内存的重要性比CPU还要高的多!因为如果内存不够大,就会使用到硬盘的内存交换空间(swap)。根据计算机概论硬盘比内存的速度要慢的多,所以内存太小可能会影响到整体系统的性能! 如果是一般小型服务器,通常重点在于容量,硬盘容量大于20GB就够用了! 但如果你的服务器是作为备份或者是小企业的文件服务器,那么你可能就得要考虑较高阶的磁盘阵列(RAID)模式了。 磁盘阵列(RAID)是利用硬件技术将数个硬盘整合成为一个大硬盘的方法,操作系统只会看到最后被整合起来的大硬盘。由于磁盘阵列是由多个硬盘组成,所以可以达成速度性能、备份等任务。 在Linux系统中,每个设备都被当成一个文件来对待,举例:SATA接口的硬盘的文件名称即为/dev/sd[a-d],其中,括号内的字母为a-d当中的任意一个,亦即有/dev/sda, /dev/sdb, /dev/sdc, 及 /dev/sdd这四个文件的意思。 Linux系统中,每个设备都被当成一个文件来对待,每个设备都会有设备文件名。,几乎所有的硬件设备文件都在/dev这个目录内, 所以你会看到/dev/sda, /dev/sr0等等的文件名。 设备 设备在Linux内的文件名SCSI/SATA/USB硬盘机 /dev/sd[a-p]USB闪存盘 /dev/sd[a-p]VirtI/O界面 /dev/vd[a-p](用于虚拟机内)软盘机 /dev/fd[0-7]打印机 /dev/lp[0-2](25针打印机) /dev/usb/lp[0-15] (USB 接口)鼠标 /dev/input/mouse[0-15] (通用) /dev/psaux (PS/2界面) /dev/mouse (当前鼠标)CDROM/DVDROM /dev/scd[0-1] (通用) /dev/sr[0-1] (通用,CentOS 较常见) /dev/cdrom (当前 CDROM)磁带机 /dev/ht0 (IDE 界面) /dev/st0 (SATA/SCSI界面) /dev/tape(当前磁带)IDE硬盘机 /dev/hd[a-d] (旧式系统才有) Linux目录树结构所谓的目录树架构(directory tree)就是以根目录为主,然 后向下呈现分支状的目录结构的一种文件架构。 所以,整个目录树架构最重要的就是那个根 目录(root directory),这个根目录的表示方法为一条斜线“/”, 所有的文件都与目录树有关。目录树的呈现方式如下图所示: Linux系统使用的是目录树架构,但是我们的文件数据其实是放置在磁盘分区当中的。 文件系统与目录树的关系(挂载) 在默认的CentOS环境中,下面的 目录是比较符合容量大且(或)读写频繁的目录: 文件系统项目 ext2/ext3/ext4:Linux早期适用的文件系统类型。由于ext3/ext4文件系统多了日志的记录, 对于系统的复原比较快速。不过由于磁盘容量越来越大,ext家族似乎有点挡不住了 ~所以除非你有特殊的设置需求,否则近来比较少使用 ext4 项目了! swap:就是磁盘仿真成为内存,由于swap并不会使用到目录树的挂载,所以用swap就不需要指定挂载点喔。BIOS Boot:就是 GPT 分区表可能会使用到的项目,若你使用 MBR 分区,那就不需要这个项目了! xfs:这个是目前 CentOS 默认的文件系统,最早是由大型服务器所开发出来的! 他对于大容量的磁盘管理非常好,而且格式化的时候速度相当快,很适合当今动不动就是好几个TB 的磁盘的环境! vfat:同时被Linux与Windows所支持的文件系统类型。如果你的主机硬盘内同时存在 Windows与Linux操作系统,为了数据的交换, 确实可以创建一个vfat的文件系统喔! [dmtsai@study ~]$ _:正确登陆之后才显示的讯息, 最左边的 dmtsai 显示的是“目前使用者的帐号”,而@之后接的 study 则是“主机名称”,至于最右边的~则指的是 “目前所在的目录”,那个KaTeX parse error: Expected 'EOF', got '#' at position 183: …中,默认root的提示字符为 #̲ ,而一般身份使用者的提示字符… 。那么如何离开系统呢?其实应该说“登出Linux”才对!登出很简单,直接这样做: [dmtsai@study ~]$ exit[dmtsai@study ~]$ command [-options] parameter1 parameter2 … 指令 选项 参数(1) 参数(2) 上述指令详细说明如下: 1. 一行指令中第一个输入的部分绝对是“指令(command)”或“可可执行文件案(例如批次脚本,script)” 2. command 为指令的名称,例如变换工作目录的指令为 cd 等等; 3. 中刮号[]并不存在于实际的指令中,而加入选项设置时,通常选项前会带 - 号,例如 -h; 有时候会使用选项的完整全名,则选项前带有 – 符号,例如 --help; 4. parameter1 parameter2… 为依附在选项后面的参数,或者是 command 的参数; 5. 指令,选项, 参数等这几个咚咚中间以空格来区分,不论空几格 shell 都视为一格。所以空格是很重要的特殊字符!; 6. 按下[Enter]按键后,该指令就立即执行。[Enter]按键代表着一行指令的开始启动。 7. 指令太长的时候,可以使用反斜线 (\) 来跳脱[Enter]符号,使指令连续到下一行。注意!反斜线后就立刻接特殊字符,才能跳脱!8. 其他: i. 在 Linux 系统中,英文大小写字母是不一样的。举例来说, cd 与 CD 并不同。 Linux 的文件权限与目录配置Linux一般将文件可存取的身份分为三个类别,分别是 owner/group/others,即拥有者、群组,其他人,且三种身份各有 read/write/execute 等权限。 在Linux系统当中,默认的情况下,所有的系统上的帐号与一般身份使用者,还有个 root的相关信息,都是记录在/etc/passwd这个文件内的。个人的密码则是记录在/etc/shadow这个文件下。此外,Linux所有的群组名称都纪录在/etc/group内!这三个文件可以说是Linux系统里面帐号、密码、群组信息的集中地! Linux 文件权限概念 Linux文件属性 如果文件名之前多一个“ . ”,则代表这个文件为“隐藏文件”,例如上表中的.config那一行,该文件就是隐藏文件。即 第一个字符代表这个文件是“目录、文件或链接文件等等”: 当为[ d ]则是目录,例如上表文件名为“.config”的那一行; 当为[ - ]则是文件,例如上表文件名为“initial-setup-ks.cfg”那一行; 若是[ l ]则表示为链接文件(link file); 若是[ b ]则表示为设备文件里面的可供储存的周边设备(可随机存取设备);若是[ c ]则表示为设备文件里面的序列埠设备,例如键盘、鼠标(一次性读取设 备)。 接下来的字符中,以三个为一组,且均为“rwx” 的三个参数的组合。其中,[ r ]代表可读(read)、[ w ]代表可写(write)、[ x ]代表可执行(execute)。 要注意的是,这三个权限的位置不会改变,如果没有权限,就会出现减号[ - ]而已。 若有一个文件的类型与权限数据为“-rwxr-xr–”,请说明其意义为何?答:先将整个类型与权限数据分开查阅,并将十个字符整理成为如下所示: > [-][rwx][r-x][r–] > 1 234 567 890 1 为:代表这个文件名为目录或文件,本例中为文件(-); 234为:拥有者的权限,本例中为可读、可写、可执行(rwx); 567为:同群组使用者权限,本例中为可读可执行(rx); 890为:其他使用者权限,本例中为可读(r),就是只读之意同时注意到,rwx所在的位置是不会改变的,有该权限就会显示字符,没有该权限就变成减号(-)就是了。 例题:假设test1, test2, test3同属于testgroup这个群组,如果有下面的两个文件,请说明两个 文件的拥有者与其相关的权限为何? -rw-r–r-- 1 root root 238 Jun 18 17:22 test.txt -rwxr-xr-- 1 test1 testgroup 5238 Jun 19 10:25 ping_tsai答:文件test的拥有者为root,所属群组为root,只有root账号可以存取文件,其他账号只能读取此文件。文件ping_tsai的拥有者为test1,所属群组为testgroup,其中test1可以针对此文件具有可读可写可执行的权力,而同群组的test2, test3两个人与test1同样是testgroup的群组帐号,则仅可读可执行但不能写(亦即不能修改);至于没有加入testgroup这一个群组的其他人则仅可以读,不能写也不能执行!例题:请问testgroup这个群组的成员与其他人 (others)是否可以进入本目录? drwxr-xr-- 1 test1 testgroup 5238 Jun 19 10:25 groups/ 答: 文件拥有者test1[rwx]可以在本目录中进行任何工作; 而testgroup这个群组[r-x]的帐号,例如test2, test3亦可以进入本目录进行工作,但是不能在本目录下进行写入的动作; 至于other的权限中[r–]虽然有r ,但是由于没有x的权限,因此others的使用者,并不能进入此目录! 如何改变文件属性与权限几个常用于群组、拥有者、各种身份的 权限之修改的指令,如下所示: chgrp :改变文件所属群组chown :改变文件拥有者chmod :改变文件的权限, SUID, SGID, SBIT等等的特性 改变所属群组, chgrp要被改变的群组名称必须要在/etc/group文件内存在才行,否则就会显示错误!假设你已经是root的身份了,那么在你的主文件夹内有一个名为 initial-setup-ks.cfg 的文件,如何将该文件的群组改变一下呢?假设你已经知道在/etc/group里面已经存在一个名为users的群组,但是testing这个群组名字就不存在/etc/group当中了,此时改变群组成为users与 testing分别会有什么现象发生呢?[root@study ~]# chgrp [-R] dirname/filename … 选项与参数: -R : 进行递回(recursive)的持续变更,亦即连同次目录下的所有文件、目录 都更新成为这个群组之意。常常用在变更某一目录内所有的文件之情况。 范例:[root@study ~]# chgrp users initial-setup-ks.cfg [root@study ~]# ls -l -rw-r–r--. 1 root users 1864 May 4 18:01 initial-setup-ks.cfg[root@study ~]# chgrp testing initial-setup-ks.cfg chgrp: invalid group: testing' <== 发生错误讯息啰~找不到这个群组名~ 改变文件拥有者, chown使用者必须是已经存在系统中的帐号,也就是在/etc/passwd 这个文件中有纪录的使用者名称才能改变。chown还可以顺便直接修改群组的名称呢语法与实例:[root@study ~]# chown [-R] 帐号名称 文件或目录 [root@study ~]# chown [-R] 帐号名称:群组名称 文件或目录 选项与参数: -R : 进行递回(recursive)的持续变更,亦即连同次目录下的所有文件都变更 范例:将 initial-setup-ks.cfg 的拥有者改为bin这个帐号:[root@study ~]# chown bin initial-setup-ks.cfg [root@study ~]# ls -l -rw-r--r--. 1 bin users 1864 May 4 18:01 initial-setup-ks.cfg 范例:将 initial-setup-ks.cfg 的拥有者与群组改回为root: [root@study ~]# chown root:root initial-setup-ks.cfg [root@study ~]# ls –l -rw-r--r--. 1 root root 1864 May 4 18:01 initial-setup-ks.cfg chown也可以使用“chown user.group file”,即在拥有者与群组间加上小数 点“ . ”也行!比较建议使用冒号“:”来隔开拥有者与群组!此外,chown也能单纯的修改所属群组呢! 例如“chown .sshd initial-setup-ks.cfg”就是修改群组~看到了吗?就是那个小数点的用途! [root@study ~]# cp 来源文件 目的文件 假设你今天要将.bashrc这个文件拷贝成为.bashrc_test文件名,且是要给bin这个人,你可以这样做: [root@study ~]# cp .bashrc .bashrc_test [root@study ~]# ls -al .bashrc* -rw-r--r--. 1 root root 176 Dec 29 2013 .bashrc -rw-r--r--. 1 root root 176 Jun 3 00:04 .bashrc_test <==新文件的属性没变 复制行为(cp)会复制执行者的属性与权限,bashrc_test还是属于root 所拥有, 如此一来,即使你将文件拿给bin这个使用者了,那他仍然无法修改的(看属性/权限), 所以你就必须要将这个文件的拥有者与群组修改一下。 改变权限, chmod数字类型改变文件权限数字类型改变文件权限 Linux文件的基本权限就有九个,分别是owner/group/others三种身份各有自己的 read/write/execute权限,文件的权限字符为:“- rwxrwxrwx”, 这九个权限是三个三个一组的!,我们可以使用数字来代表各个权限,各权限的分数对照表如下: > r:4 > w:2 > x:1 每种身份(owner/group/others)各自的三个权限(r/w/x)分数是需要累加的,例如当权限为: [-rwxrwx---] 分数则是: > owner = rwx = 4+2+1 = 7 > group = rwx = 4+2+1 = 7 > others= --- = 0+0+0 = 0所以等一下我们设置权限的变更时,该文件的权限数字就是770啦!变更权限的指令 chmod的语法: [root@study ~]# chmod [-R] xyz 文件或目录 选项与参数: xyz : 就是刚刚提到的数字类型的权限属性,为 rwx 属性数值的相加。 -R : 进行递回(recursive)的持续变更,亦即连同次目录下的所有文件都会变更举例,如果要将.bashrc这个文件所有的权限都设置启用,那么:[root@study ~]# ls -al .bashrc -rw-r--r--. 1 root root 176 Dec 29 2013 .bashrc [root@study ~]# chmod 777 .bashrc [root@study ~]# ls -al .bashrc -rwxrwxrwx. 1 root root 176 Dec 29 2013 .bashrc 如果要将权限变成“ -rwxr-xr-- ”呢?那么权限的分数就成为 [4+2+1][4+0+1] [4+0+0]=754 符号类型改变文件权限九个权限分别是 (1)user (2)group (3)others三种身份啦!那么我们就可以借由u, g, o来代表三种身份的权限!此外, a 则代表 all 亦即全部的身份!那么读写的权限就可以写成r, w, x! 假如我们要“设置”一个文件的权限成为“-rwxr-xr-x”时,基本上就是:user (u):具有可读、可写、可执行的权限;group 与 others (g/o):具有可读与执行的权限。 所以就是:[root@study ~]# chmod u=rwx ,go=rx .bashrc # 注意喔!那个 u=rwx,go=rx 是连在一起的,中间并没有任何空白字符! [root@study ~]# ls -al .bashrc -rwxr-xr-x. 1 root root 176 Dec 29 2013 .bashrc “ -rwxr-xr-- ”权限,可以用chmod u=rwx,g=rx,o=r filename 如果我不知道原先的文件属性,而我只想要增加.bashrc这个文件的每个人均可写入的权限, 那么我就可以使用: [root@study ~]# ls -al .bashrc -rwxr-xr-x. 1 root root 176 Dec 29 2013 .bashrc [root@study ~]# chmod a+w .bashrc [root@study ~]# ls -al .bashrc -rwxrwxrwx. 1 root root 176 Dec 29 2013 .bashrc 而如果是要将权限去掉而不更动其他已存在的权限呢?例如要拿掉全部人的可执行权限,则: [root@study ~]# chmod a-x .bashrc [root@study ~]# ls -al .bashrc -rw-rw-rw-. 1 root root 176 Dec 29 2013 .bashrc [root@study ~]# chmod 644 .bashrc 目录与文件之权限意义:权限对文件的重要性:文件是实际含有数据的地方,包括一般文本文件、数据库内容档、二进制可可执行文件(binary program)等等。 因此,权限对于文件来说,他的意义是这样的: r (read):可读取此一文件的实际内容,如读取文本文件的文字内容等; w (write):可以编辑、新增或者是修改该文件的内容(但不含删除该文件); x (eXecute):该文件具有可以被系统执行的权限。在Linux下面,我们的文件是否能被执行,是借由是否具有“x”这个权限来决定的!跟文件名是没有绝对的关系! 你对一个文件具有w权限时,你可以具有写入/编辑/新增/修改文件的内容的权限, 但并不具备有删除该文件本身的权限。权限对目录的重要性:文件是存放实际数据的所在,那么目录主要的内容在记录文件名清单,文件名与目录有强烈的关连!所以如果是针对目录时,那个 r, w, x 对目录是意义如下:r (read contents in directory):表示具有读取目录结构清单的权限,所以当你具有读取(r)一个目录的权限时,表示你可以查询该目录下的文件名数据。所以你就可以利用 ls 这个指令将该目录的内容列表显示出来! w (modify contents of directory):这个可写入的权限对目录来说,是很了不起的!因为他表示你具有异动该目录结构清单的权限,也就是下面这些权限: 创建新的文件与目录; 删除已经存在的文件与目录(不论该文件的权限为何!) 将已存在的文件或目录进行更名; 搬移该目录内的文件、目录位置。 总之,目录的w权限就与该目录下面的文件名异动有关就对了啦! x (access directory):目录不可以被执行,目录的x代表的是使用者能否进入该目录成为工作目录的用途! 所谓的工作目录(work directory)就是你目前所在的目录啦!举例来说,你所在的主文件夹就是你当下的工作目录。而变换目录的指令是“cd”(change directory)! 例题:有个目录的权限如下所示: drwxr--r-- 3 root root 4096 Jun 25 08:35 .ssh系统有个帐号名称为vbird,这个帐号并没有支持root群组,请问vbird对这个目录有何权限?是否可切换到此目录中?答:vbird对此目录仅具有r的权限,因此vbird可以查询此目录下的文件名列表。因为vbird不具有x的权限,即 vbird 没有这个抽屉的钥匙! 因此vbird并不能切换到此目录内! 要开放目录给任何人浏览时,应该至少也要给予r及x 的权限。 例题:假设有个帐号名称为dmtsai,他的主文件夹在/home/dmtsai/,dmtsai对此目录具有 [rwx]的权限。 若在此目录下有个名为the_root.data的文件,该文件的权限如下: -rwx------ 1 root root 4365 Sep 19 23:20 the_root.data 请问dmtsai对此文件的权限为何?可否删除此文件?答:如上所示,由于dmtsai对此文件来说 是“others”的身份,因此这个文件他无法读、无法编辑也无法执行, 也就是说,他无法变动这个文件的内容。但是由于这个文件在他的主文件夹下,他在此目录下具有rwx的完整权限,因此对于 the_root.data这个“文件名”来说,他是能够“删除”的! 结论就是,dmtsai这个用户能够删除 the_root.data这个文件! | 举例:我们用root的身份在所有人都可以工作的/tmp目录中创建一个名为testing的目录,该目录的权限为744且目录拥有者为root。另外,在testing目录下在创建一个空的文件,文件名亦为 testing。创建目录可用mkdir(make directory),创建空文件可用touch来处理。 所以过程如下所示:[root@study ~]# cd /tmp <==切换工作目录到/tmp [root@study tmp]# mkdir testing <==创建新目录 [root@study tmp]# chmod 744 testing <==变更权限 [root@study tmp]# touch testing/testing <==创建空的文件 [root@study tmp]# chmod 600 testing/testing <==变更权限 [root@study tmp]# ls -ald testing testing/testing drwxr--r--. 2 root root 20 Jun 3 01:00 testing -rw-------. 1 root root 0 Jun 3 01:00 testing/testing # 仔细看一下,目录的权限是 744 ,且所属群组与使用者均是 root! # 那么在这样的情况下面,一般身份使用者对这个目录/文件的权限为何?[dmtsai@study ~]$ cd /tmp [dmtsai@study tmp]$ ls -l testing/ ls: cannot access testing/testing: Permission denied total 0 ?????????? ? ? ? ? ? testing # 虽然有告知权限不足,但因为具有 r 的权限可以查询文件名。由于权限不足(没有x),所以会有一堆问号。 [dmtsai@study tmp]$ cd testing/ -bash: cd: testing/: Permission denied # 因为不具有 x ,所以当然没有进入的权限啦! 如果该目录属于用户本身,会有什么状况?如果我们让该目录变成使用者的,那么使用者在这个目录下面是否能够删除文件呢? # 1\. 先用 root 的身份来搞定 /tmp/testing 的属性、权限设置:[root@study tmp]# chown dmtsai /tmp/testing [root@study tmp]# ls -ld /tmp/testing drwxr--r--. 2 dmtsai root 20 6月 3 01:00 /tmp/testing # dmtsai 是具有全部权限的! # 2\. 再用 dmtsai 的帐号来处理一下 /tmp/testing/testing 这个文件看看: [dmtsai@study tmp]$ cd /tmp/testing [dmtsai@study testing]$ ls -l <==确实是可以进入目录 -rw-------. 1 root root 0 Jun 3 01:00 testing <==文件不是vbird的! [dmtsai@study testing]$ rm testing <==尝试杀掉这个文件看看! rm: remove write-protected regular empty filetesting’? y # 竟然可以删除!这样理解了吗?! 使用者操作功能与权限假设两个文件名,分别是下面: /dir1/file1 /dir2 假设你现在在系统使用 dmtsai 这个帐号,那么这个帐号针对 /dir1, /dir1/file1, /dir2 这三个文件名来说,分别需要“哪些最小的权限”才能达成各项任务? 要读一个文件时,你得要具有“这个 文件所在目录的 x 权限”才行!所以,通常要开放的目录, 至少会具备 rx 这两个权限! Linux文件种类与扩展名文件种类:1、正规文件(regular file ): 就是一般我们在进行存取的类型的文件,在由 ls -al 所显示出来的属性方面,第一个字符为 [ - ],例如 [-rwxrwxrwx ]。另外,依照文件的内容,又大略可以分为:纯文本文件(ASCII):这是Linux系统中最多的一种文件类型, 称为纯文本文件是因为内容为我们人类可以直接读到的数据,例如数字、字母等等。几乎只要我们可以用来做为设置的文件都属于这一种文件类型。 举例来说,你可以下达“ cat ~/.bashrc ”就可以看到该文件的内容。(cat是将一个文件内容读出来的指令) 二进制档(binary):我们的系统其实仅认识且可以执行二进制文件(binary file)Linux当中的可执行文件(scripts, 文字体批处理文件不算)就是这种格式的,举例来说,刚刚下达的指令cat就是一个binary file。 数据格式文件(data): 有些程序在运行的过程当中会读取某些特定格式的文件, 那些特定格式的文件可以被称为数据文件(data file)。举例来说,我们的Linux在使用者登陆时,都会将登录的数据记录在 /var/log/wtmp那个文件内,该文件是一个data file,他能够通过last这个指令读出来! 但是使用cat时,会读出乱码~因为他是属于一种特殊格式的文件。2、目录(directory):第一个属性为 [ d ],例如 [drwxrwxrwx]。3、链接文件(link)就是类似Windows系统下面的捷径啦! 第一个属性为 [ l ]例如 [lrwxrwxrwx] 4、设备与设备文件(device): 与系统周边及储存等相关的一些文件, 通常都集中在/dev 这个目录之下!通常又分为两种: 区块(block)设备文件 :就是一些储存数据,以提供系统随机存取的周边设备,举例来说,硬盘与软盘等!你可以随机的在硬盘的不同区块读写,这种设备就 是区块设备!你可以自行查一下/dev/sda看看, 会发现第一个属性为[ b ]! 字符(character)设备文件:亦即是一些序列埠的周边设备,例如键盘、鼠标等 等!这些设备的特色就是“一次性读取”的,不能够截断输出。第一个属性为 [ c ]。5、数据接口文件(sockets):这种类型的文件通常被用在网络上的数据承接了。我们可以启动一个程序来监听用户端的要求,而用户端就可以通过这个socket来进行数据的沟通了。第一个属性为 [ s ], 最常在/run或/tmp这些个目录中看到这种文件类型了。6、数据输送档(FIFO, pipe):FIFO也是一种特殊的文件类型,他主要的目的在解决多个程序同时存取一个文件所造成的错误问题。FIFO是first-in-first-out的缩写。第一个属性为 [p] 。Linux文件扩展名:一个Linux文件能不能被执行,与他的第一栏的十个属性有关, 与文件名根本一点关系也没有,只要你的权限当中具有x的话,即代表这个文件具有可以被执行的能力。数种常用的扩展名: .sh : 脚本或批处理文件 (scripts),因为批处理文件为使用shell写成的,所以扩展名就编成 .sh; Z, .tar, .tar.gz, .zip, .tgz: 经过打包的压缩文件。这是因为压缩软件分别为 gunzip, tar 等等的,由于不同的压缩软件,而取其相关的扩展名! .html, .php:网页相关文件,分别代表 HTML 语法与 PHP 语法的网页文件! .html的文件可使用网页浏览器来直接打开,至于 .php 的文件,则可以通过 client 端的浏览器来 server 端浏览,以得到运算后的网页结果呢! Linux文件长度限制[1]:传统的Ext2/Ext3/Ext4文件系统以及CentOS 7默认文件系统的 xfs,针对文件的文件名长度限制为:单一文件或目录的最大容许文件名为 255Bytes,以一个 ASCII 英文占用一个 Bytes 来 说,则大约可达 255个字符长度。若是以每个中文字占用 2Bytes 来说,最大文件名就是大约在 128 个中文字之谱!Linux文件名称的限制:由于Linux在命令行下的一些指令操作关系,一般来说,你在设置Linux下面的文件名称时, 最好可以避免一些特殊字符比较好!例如下面这些: ? > < ; & ! [ ] | \ ’ " ( ) { } 因为这些符号在命令行下,是有特殊意义的!另外,文件名称的开头为小数点“.”时,代表这个文件为“隐藏文件”!同时,由于指令下达当中,常常会使用到 -option 之类的选项, 所以 你最好也避免将文件文件名的开头以 - 或 + 来命名啊! Linux目录配置的依据—FHS 上表中的目录就是一些代表性的目录可分享的:可以分享给其他系统挂载使用的目录,所以包括可执行文件与使用者的邮件等数据, 是能够分享给网络上其他主机挂载用的目录; 不可分享的:自己机器上面运行的设备文件或者是与程序有关的socket文件等, 由于仅与自身机器有关,所以当然就不适合分享给其他主机了。不变的:有些数据是不会经常变动的,跟随着distribution而不变动。 例如函数库、文件说明文档、系统管理员所管理的主机服务配置文件等等; 可变动的:经常改变的数据,例如登录文件、一般用户可自行收受的新闻群组等。 FHS针对目录树架构仅定义出三层目录下面应该放置什么数据而已,分别是下面这三个目录的定义: / (root, 根目录):与开机系统有关; /usr (unix software resource):与软件安装/执行有关; /var (variable):与系统运行过程有关。 根目录 (/) 的意义与内容:根目录是整个系统最重要的一个目录,因为不但所有的目录都是由根目录衍生出来的,同时根目录也与开机/还原/系统修复等动作有关。由于系统开机时需要特定的开机软件、核心文件、开机所需程序、函数库等等文件数据,若系统出现错误时,根目录也必须要包含有能够修复文件系统的程序才行。 因为根目录是这么的重要,所以在FHS的要求方面,他希望根目录不要放在非常大的分区内, 因为越大的分区你会放入越多的数据,如此一来根目录所在分区就可能会有较多发生错误的机会。因此FHS标准建议:根目录(/)所在分区应该越小越好,且应用程序所安装的软件最好不要与根目录放在同一个分区内,保持根目录越小越好。如此不但性能较佳,根目录所在的文件系统也较不容易发生问题。 FHS要求必须要存在的目录/bin 系统有很多放置可执行文件的目录,但/bin比较特殊。因为/bin放置的是在单人维护模式下还能够被操作的指令。在/bin下面的指令可以被root与一般帐号所使用,主要有:cat, chmod, chown, date, mv, mkdir, cp, bash等等常用的指令。/boot 这个目录主要在放置开机会使用到的文件,包括Linux核心文件以及开机菜单与开机所需配置文件等等。 Linux kernel常用的文件名为:vmlinuz,如果使用的是grub2这个开机管理程序,则还会存在/boot/grub2/这个目录喔! /dev Linux系统上,任何设备与周边设备都是以文件的型态存在于这个目录当中的。你只要通过存取这个目录下面的某个文件,就等于存取某个设备,比较重要的文件有/dev/null, /dev/zero, /dev/tty, /dev/loop, /dev/sd等等/etc 系统主要的配置文件几乎都放置在这个目录内,例如人员的帐号密码档、各种服务的启始档等等。一般来说,这个目录下的各文件属性是可以让一般使用者查阅的,但是只有root有权力修改。FHS建议不要放置可可执行文件 (binary)在这个目录中喔。比较重要的文件有: /etc/modprobe.d/, /etc/passwd, /etc/fstab, /etc/issue 等等。另外 FHS 还规范几个重要的目录 最好要存在 /etc/ 目录下喔:/etc/opt(必要):这个目录在放置第三方协力软件 /opt 的相关配置文件 /etc/X11/(建议):与 X Window 有关的各种配 置文件都在这里,尤其是 xorg.conf 这个 X Server 的配置文件。 /etc/sgml/ (建议):与 SGML 格式有关的各项配置文件 /etc/xml/(建议):与 XML 格式有关的各项配置文件。/lib 系统的函数库非常的多,而/lib放置的则是在开机时会用到的函数库, 以及在/bin或/sbin下面的指令会调用的函数库而已。 什么是函数库呢?你可以将 他想成是“外挂”,某些指令必须要有这些“外挂”才能够顺利完成程序的执行之意。另外FSH 还要求下面的目录必须要存在:/lib/modules/:这个目录 主要放置可抽换式的核心相关模块(驱动程序)! /media /media下面放置的就是可移除的设备啦! 包括软盘、光盘、DVD等等设备都暂时挂载于此。常见的文件名 有:/media/floppy, /media/cdrom等等。/mnt 如果你想要暂时挂载某些额外的设备,一般建议你可以放置到这个目录中。 在古早时候,这个目录的用途与/media相同啦!只是有了/media之后,这个 目录就用来暂时挂载用了。/opt 这个是给第三方协力软件放置的目录。什么是第三方协力软件啊? 举例来说,KDE这个桌面管理系统是一个独立的计划,不过他可以安装到Linux系统中,因此KDE的软件就建议放置到此目录下了。另外,如果你想要自行安装额外的软件(非原本的distribution提供的),那么也能够将你的软件安装到这里来。 不过,以前的Linux系统中,我们还是习惯放置在/usr/local目录下呢!/run 早期的 FHS 规定系统开机后所产生的各项信息应该要放置到 /var/run 目录 下,新版的 FHS 则规范到 /run 下面。 由于 /run 可以使用内存来仿真,因 此性能上会好很多!/sbin Linux有非常多指令是用来设置系统环境的,这些指令只有root才能够利用 来“设置”系统,其他使用者最多只能用来“查询”而已。 放在/sbin下面的为开 机过程中所需要的,里面包括了开机、修复、还原系统所需要的指令。 至 鸟哥的 Linux 私房菜:基础学习篇 第四版 5.3 Linux目录配置 282 于某些服务器软件程序,一般则放置到/usr/sbin/当中。至于本机自行安装的 软件所产生的系统可执行文件(system binary), 则放置到/usr/local/sbin/ 当中了。常见的指令包括:fdisk, fsck, ifconfig, mkfs等等。/srv 一些网络服务启动之后,这些服务所需要取用的数据目录。 常见的服务例如WWW, FTP等等。举例来说,WWW服 务器需要的网页数据就可以放置在/srv/www/里面。 不过,系统的服务数据 如果尚未要提供给网际网络任何人浏览的话,默认还是建议放置到 /var/lib 下面即可。 /tmp 这是让一般使用者或者是正在执行的程序暂时放置文件的地方。这个目录是任何人都能够存取的,所以你需要定期的清理一下。当然,重要数据不可放置在此目录啊!因为FHS甚至建议在开机时,应该要将/tmp下的数据都删除唷! /usr 第二层 FHS 设置,后续介绍 /var 第二曾 FHS 设置,主要为放置变动性的数据,后续介绍 FHS 建议可以存在的目录/home 系统默认的使用者主文件夹(home directory)。在你新增一个一般使 用者帐号时,默认的使用者主文件夹都会规范到这里来。比较重要的是,主文件夹有两种代号:~:代表目前这个使用者的主文件夹 ~dmtsai :则代表 dmtsai 的主文件夹! /lib 用来存放与 /lib 不同的格式的二进制函数库,例如支持 64 位的 /lib64 函数 库等 /root 系统管理员(root)的主文件夹。之所以放在这里,是因为如果进入单人维护模式而仅挂载根目录时,该目录就能够拥有root的主文件夹,所以我们会希望root的主文件夹与根目录放置在同一个分区中。 下面是几个在Linux当中也是非常重要的目录/lost+found 这个目录是使用标准的ext2/ext3/ext4文件系统格式才会产生的一个目录,目的在于当文件系统发生错误时,将一些遗失的片段放置到这个目录下。不过如果使用的是xfs 文件系统的话,就不会存在这个目录了! /proc 这个目录本身是一个“虚拟文件系统(virtual filesystem)”!他放置的数据都是在内存当中, 例如系统核心、行程信息(process)、周边设备的状态及网络状态等等。因为这个目录下的数据都是在内存当中,所以本身不占任何硬盘空间啊!比较重要的文件例如:/proc/cpuinfo, /proc/dma, /proc/interrupts, /proc/ioports, /proc/net/* 等等。 /sys 这个目录其实跟/proc非常类似,也是一个虚拟的文件系统,主要也是记录核心与系统硬件信息较相关的信息。包括目前已载入的核心模块与核心侦 测到的硬件设备信息等等。这个目录同样不占硬盘容量喔! /usr 的意义与内容:依据FHS的基本定义,/usr里面放置的数据属于可分享的与不可变动(shareable, static)。所有系统默认的软件(distribution发布者提供的软件)都会放置到/usr下面。一般来说,/usr的次目录 建议有下面这些: /var 的意义与内容:/var目录主要针对常态性变动的文件,包括高速缓存(cache)、登录文件 (log file)以及某些软件运行所产生的文件, 包括程序文件(lock file, run file),或者例如 MySQL数据库的文件等等。 CentOS 7 在目录的编排上与过去的版本不同。比较大的差异在于将许多原本应该要在根目录 (/) 里面的目录,将他内部数据全部挪到 /usr 里面去,然后进行链接设置!包括下面这些: 目录树(directory tree)在Linux下面,所有的文件与目录都是由根目录开始的。目录树的启始点为根目录 (/, root);每一个目录不止能使用本地端的 partition 的文件系统,也可以使用网络上的 filesystem 。举例来说,可以利用 Network File System(NFS)服务器挂载某特定目录等。每一个文件在此目录树中的文件名(包含完整路径)都是独一无二的。 绝对路径与相对路径绝对路径:由根目录(/)开始写起的文件名或目录名称, 例如 /home/dmtsai/.bashrc; 相对路径:相对于目前路径的文件名写法。 例如 ./home/dmtsai 或 ../../home/dmtsai/ 等等。反正开头不是 / 就属于相对路径的写法。举例来说,你目前在 /home 这个目录下,如果想要进入 /var/log 这个目录时,可以怎么写呢? 1. cd /var/log (absolute) 2. cd ../var/log (relative) 因为你在 /home 下面,所以要回到上一层(../)之后,才能继续往 /var 来移动的!特别注意这两个特殊的目录: . :代表当前的目录,也可以使用 ./ 来表示; .. :代表上一层目录,也可以 ../ 来代表。 例题:如何先进入/var/spool/mail/目录,再进入到/var/spool/cron/目录内?答:由于/var/spool/mail与/var/spool/cron是同样在/var/spool/目录中,因此最简单的指令下达方法为: 1. cd /var/spool/mail 2. cd ../cron Linux 文件与目录管理比较特殊的目录, . 代表此层目录 .. 代表上一层目录 - 代表前一个工作目录 ~ 代表“目前使用者身份”所在的主文件夹 ~account 代表 account 这个使用者的主文件夹(account是个帐号名称) dmtsai这个使用者的主文件夹是/home/dmtsai/,而root主文件夹则是/root/,假设我以root身份在 Linux系统中,简单的说明一下这几个特殊的目录的意义是: [dmtsai@study ~]$ su – # 先切换身份成为 root 看看! [root@study ~]# cd [相对路径或绝对路径] # 最重要的就是目录的绝对路径与相对路径,还有一些特殊目录的符号啰! [root@study ~]# cd ~dmtsai # 代表去到 dmtsai 这个使用者的主文件夹,亦即 /home/dmtsai [root@study dmtsai]# cd ~ # 表示回到自己的主文件夹,亦即是 /root 这个目录 [root@study ~]# cd # 没有加上任何路径,也还是代表回到自己主文件夹的意思喔! [root@study ~]# cd .. # 表示去到目前的上层目录,亦即是 /root 的上层目录的意思; [root@study /]# cd – # 表示回到刚刚的那个目录,也就是 /root [root@study ~]# cd /var/spool/mail # 这个就是绝对路径的写法!直接指定要去的完整路径名称! [root@study mail]# cd ../postfix # 这个是相对路径的写法,我们由/var/spool/mail 去到/var/spool/postfix 就这样写! pwd (显示目前所在的目录)[root@study ~]# pwd [-P] 选项与参数: -P :显示出确实的路径,而非使用链接(link)路径。 范例:单纯显示出目前的工作目录: [root@study ~]# pwd /root <== 显示出目录啦~ 范例:显示出实际的工作目录,而非链接文件本身的目录名而已 [root@study ~]# cd /var/mail <==注意,/var/mail是一个链接文件 [root@study mail]# pwd /var/mail <==列出目前的工作目录 [root@study mail]# pwd -P /var/spool/mail <==怎么回事?有没有加 -P 差很多~ [root@study mail]# ls -ld /var/mail lrwxrwxrwx. 1 root root 10 May 4 17:51 /var/mail -> spool/mail # 看到这里应该知道为啥了吧?因为 /var/mail 是链接文件,链接到 /var/spool/mail # 所以,加上 pwd -P 的选项后,会不以链接文件的数据显示,而是显示正确的完整路径啊! mkdir (创建新目录)[root@study ~]# mkdir [-mp] 目录名称 选项与参数: -m :设置文件的权限喔!直接设置,不需要看默认权限 (umask)-p :帮助你直接将所需要的目录(包含上层目录)递回创建起来! 范例:请到/tmp下面尝试创建数个新目录看看: [root@study ~]# cd /tmp [root@study tmp]# mkdir test <==创建一名为 test 的新目录 [root@study tmp]# mkdir test1/test2/test3/test4 mkdir: cannot create directory ‘test1/test2/test3/test4’: No such file or directory #系统告诉我们,没可能创建这个目录啊!就是没有目录才要创建的! [root@study tmp]# mkdir -p test1/test2/test3/test4 # 原来是要建 test4 上层没先建 test3 之故!加了这个 -p 的选项,可以自行帮你创建多层目录! 范例:创建权限为rwx--x--x的目录 [root@study tmp]# mkdir -m 711 test2 [root@study tmp]# ls -ld test* drwxr-xr-x. 2 root root 6 Jun 4 19:03 test drwxr-xr-x. 3 root root 18 Jun 4 19:04 test1 drwx--x--x. 2 root root 6 Jun 4 19:05 test2 # 仔细看上面的权限部分,如果没有加上 -m 来强制设置属性,系统会使用默认属性。 # 那么你的默认属性为何?这要通过下面介绍的 [umask](../Text/index.html#umask) rmdir (删除“空”的目录)[root@study ~]# rmdir [-p] 目录名称 选项与参数: -p :连同“上层”“空的”目录也一起删除 范例:将于mkdir范例中创建的目录(/tmp下面)删除掉! [root@study tmp]# ls -ld test* <==看看有多少目录存在? drwxr-xr-x. 2 root root 6 Jun 4 19:03 test drwxr-xr-x. 3 root root 18 Jun 4 19:04 test1 drwx--x--x. 2 root root 6 Jun 4 19:05 test2 [root@study tmp]# rmdir test <==可直接删除掉,没问题 [root@study tmp]# rmdir test1 <==因为尚有内容,所以无法删除! rmdir: failed to remove ‘test1’: Directory not empty [root@study tmp]# rmdir -p test1/test2/test3/test4 [root@study tmp]# ls -ld test* <==您看看,下面的输出中test与test1不见了! drwx--x--x. 2 root root 6 Jun 4 19:05 test2 # 瞧!利用 -p 这个选项,立刻就可以将 test1/test2/test3/test4 一次删除~ # 不过要注意的是,这个 rmdir 仅能“删除空的目录”喔!注:rmdir仅能删除空目录,如果要将所有目录下的东西都杀掉就必须使用“ rm -r test ” 关于可执行文件路径的变量: $PATH查阅文件属性的指令ls完整文件名为:/bin/ls(这是绝对路径), “为什么我可以在任何地方执行/bin/ls这个指令呢? ”“echo $PATH”, echo有“显示、印出”的意 思,而 PATH 前面加的 $ 表示后面接的是变量,所以会显示出目前的 PATH ! 范例:先用root的身份列出搜寻的路径为何? [root@study ~]# echo $PATH /usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin 范例:用dmtsai的身份列出搜寻的路径为何? [root@study ~]# exit # 由之前的 su - 离开,变回原本的帐号!或再取得一个终端机皆可! [dmtsai@study ~]$ echo $PATH /usr/local/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/home/dmtsai/.local/bin:/home/dmtsai/bin # 记不记得我们前一章说过,目前 /bin 是链接到 /usr/bin 当中的喔!PATH(一定是大写)这个变量的内容是由一堆目录所组成的,每个目录中间用冒号(:)来隔 开, 每个目录是有“顺序”之分的。仔细看一下上面的输出,你可以发现到无论是root还是 dmtsai都有 /bin 或 /usr/bin 这个目录在PATH变量内,所以当然就能够在任何地方执行ls来找到/bin/ls可执行文件啰!因为 /bin 在 CentOS 7 当中,就是链接到 /usr/bin 去的! 所以这两个目录内容会一模一样! 例题:假设你是root,如果你将ls由/bin/ls移动成为/root/ls(可用“mv /bin/ls /root”指令达 成),然后你自己本身也在/root目录下,请问(1)你能不能直接输入ls来执行?(2)若不能,你该如何执行ls这个指令?(3)若要直接输入ls即可执行,又该如何进行?答:由于这个例题的重点是将某个可执行文件移动到非正规目录去,所以我们先要进行下面的动作才行:(务必先使用 su - 切换成为root的身份) [root@study ~]# mv /bin/ls /root # mv为移动,可将文件在不同的目录间进行移动作业(1)接下来不论你在那个目录下面输入任何与ls相关的指令,都没有办法顺利的执行ls了!也就是说,你不能直接输入ls来执行,因为/root这个目录并不在PATH指定的目录中,所以,即使你在/root目录下,也不能够搜寻到ls这个指令!(2)因为这个ls确实存在于/root下面,并不是被删除了!所以我们可以通过使用绝对路径或者是相对路径直接指定这个可执行文件文件名,下面的两个方法都能够执行ls这个指令:[root@study ~]# /root/ls <==直接用绝对路径指定该文件名 [root@study ~]# ./ls <==因为在 /root 目录下,就用./ls来指定(3)如果想要让root在任何目录均可执行/root下面的ls,那么就将/root加入PATH当中即可。 加入的方法很简单,就像下面这样:[root@study ~]# PATH="${PATH}:/root"上面这个作法就能够将/root加入到可执行文件搜寻路径PATH中了 如果确定这个例题进行没有问题了,请 将ls搬回/bin下面,不然系统会挂点的! [root@study ~]# mv /root/ls /bin 例题:如果我有两个ls指令在不同的目录中,例如/usr/local/bin/ls与/bin/ls那么当我下达 ls 的 时候,哪个ls会被执行?答:找出 ${PATH} 里面哪个目录先被查询,则那个目录下的指令就会被先执行!所以用 dmtsai 帐号为例,他最先搜寻的是 /usr/local/bin, 所以 /usr/local/bin/ls 会先被执行! 例题:为什么 ${PATH} 搜寻的目录不加入本目录(.)?答: 如果在PATH中加入本目录(.)后,确实我们就能够在指令所在目录进行指令的执行了。 但是由于你的工作目录并非固定(常常会使用cd来切换到不同的目录), 因此能够执行的指令会有变动(因为每个目录下面的可可执行文件都不相同嘛!),这对使用者来说并非好事。 不同身份使用者默认的PATH不同,默认能够随意执行的指令也不同(如root与 dmtsai); PATH是可以修改的; 使用绝对路径或相对路径直接指定某个指令的文件名来执行,会比搜寻PATH来的正确; 指令应该要放置到正确的目录下,执行才会比较方便; 本目录(.)最好不要放到PATH当中。 文件与目录管理文件与目录的管理上, 不外乎“显示属性”、 “拷贝”、“删除文件”及“移动文件或目录”等等。 文件与目录的检视: ls[root@study ~]# ls [-aAdfFhilnrRSt] 文件名或目录名称.. [root@study ~]# ls [--color={never,auto,always}] 文件名或目录名称.. [root@study ~]# ls [--full-time] 文件名或目录名称.. 选项与参数: -a :全部的文件,连同隐藏文件( 开头为 . 的文件) 一起列出来(常用) -A :全部的文件,连同隐藏文件,但不包括 . 与 .. 这两个目录 -d :仅列出目录本身,而不是列出目录内的文件数据(常用) -f :直接列出结果,而不进行排序 (ls 默认会以文件名排序!) -F :根据文件、目录等信息,给予附加数据结构,例如: *:代表可可执行文件; /:代表目录; =:代表 socket 文件; |:代表 FIFO 文件; -h :将文件大小以人类较易读的方式(例如 GB, KB 等等)列出来; -i :列出 inode 号码,inode 的意义下一章将会介绍; -l :长数据串行出,包含文件的属性与权限等等数据;(常用) -n :列出 UID 与 GID 而非使用者与群组的名称 (UID与GID会在帐号管理提到!) -r :将排序结果反向输出,例如:原本文件名由小到大,反向则为由大到小; -R :连同子目录内容一起列出来,等于该目录下的所有文件都会显示出来; -S :以文件大小大小排序,而不是用文件名排序; -t :依时间排序,而不是用文件名。 --color=never :不要依据文件特性给予颜色显示; --color=always :显示颜色 --color=auto :让系统自行依据设置来判断是否给予颜色 --full-time :以完整时间模式 (包含年、月、日、时、分) 输出 --time={atime,ctime} :输出 access 时间或改变权限属性时间 (ctime) 而非内容变更时间 (modification time) 当只有下达 ls 时,默认显示的只有:非隐藏文件的文件名、 以文件名进行 排序及文件名代表的颜色显示如此而已。 举例:范例一:将主文件夹下的所有文件列出来(含属性与隐藏文件) [root@study ~]# ls -al ~ total 56 dr-xr-x---. 5 root root 4096 Jun 4 19:49 . dr-xr-xr-x. 17 root root 4096 May 4 17:56 .. -rw-------. 1 root root 1816 May 4 17:57 anaconda-ks.cfg -rw-------. 1 root root 6798 Jun 4 19:53 .bash_history -rw-r--r--. 1 root root 18 Dec 29 2013 .bash_logout -rw-r--r--. 1 root root 176 Dec 29 2013 .bash_profile -rw-rw-rw-. 1 root root 176 Dec 29 2013 .bashrc -rw-r--r--. 1 root root 176 Jun 3 00:04 .bashrc_test drwx------. 4 root root 29 May 6 00:14 .cache drwxr-xr-x. 3 root root 17 May 6 00:14 .config # 这个时候你会看到以 . 为开头的几个文件,以及目录档 (.) (..) .config 等等, # 不过,目录档文件名都是以深蓝色显示,有点不容易看清楚就是了。 范例二:承上题,不显示颜色,但在文件名末显示出该文件名代表的类型(type) [root@study ~]# ls -alF --color=never ~ total 56 dr-xr-x---. 5 root root 4096 Jun 4 19:49 ./ dr-xr-xr-x. 17 root root 4096 May 4 17:56 ../ -rw-------. 1 root root 1816 May 4 17:57 anaconda-ks.cfg -rw-------. 1 root root 6798 Jun 4 19:53 .bash_history -rw-r--r--. 1 root root 18 Dec 29 2013 .bash_logout -rw-r--r--. 1 root root 176 Dec 29 2013 .bash_profile -rw-rw-rw-. 1 root root 176 Dec 29 2013 .bashrc -rw-r--r--. 1 root root 176 Jun 3 00:04 .bashrc_test drwx------. 4 root root 29 May 6 00:14 .cache/ drwxr-xr-x. 3 root root 17 May 6 00:14 .config/ # 注意看到显示结果的第一行,嘿嘿~知道为何我们会下达类似 ./command # 之类的指令了吧?因为 ./ 代表的是“目前目录下”的意思啊!那个.bashrc 时间仅写2013,能否知道详细时间? 范例三:完整的呈现文件的修改时间 (modification time) [root@study ~]# ls -al --full-time ~ total 56 dr-xr-x---. 5 root root 4096 2015-06-04 19:49:54.520684829 +0800 . dr-xr-xr-x. 17 root root 4096 2015-05-04 17:56:38.888000000 +0800 .. -rw-------. 1 root root 1816 2015-05-04 17:57:02.326000000 +0800 anaconda-ks.cfg -rw-------. 1 root root 6798 2015-06-04 19:53:41.451684829 +0800 .bash_history -rw-r--r--. 1 root root 18 2013-12-29 10:26:31.000000000 +0800 .bash_logout -rw-r--r--. 1 root root 176 2013-12-29 10:26:31.000000000 +0800 .bash_profile -rw-rw-rw-. 1 root root 176 2013-12-29 10:26:31.000000000 +0800 .bashrc -rw-r--r--. 1 root root 176 2015-06-03 00:04:16.916684829 +0800 .bashrc_test drwx------. 4 root root 29 2015-05-06 00:14:56.960764950 +0800 .cache drwxr-xr-x. 3 root root 17 2015-05-06 00:14:56.975764950 +0800 .config # 请仔细看,上面的“时间”字段变了喔!变成较为完整的格式。 # 一般来说, ls -al 仅列出目前短格式的时间,有时不会列出年份, # 借由 --full-time 可以查阅到比较正确的完整时间格式啊! 其实 ls 的用法还有很多,包括查阅文件所在 i-node 号码的 ls -i 选项,以及用来进行文件排序 的 -S 选项,Linux 的文件系统中,这些与权限、属性有关的数据放在哪里呢? 放在 i-node 里面。复制、删除与移动: cp, rm, mv复制文件,使用 cp (copy) 这个指令即, cp指令还可以创建链接文件 (就是捷径),比对两文件的新旧而予以更新,以及复制整个目录等等的功能!至于移动目录与文件,则使用 mv (move), 这个指令也可以直接拿来作更名(rename) 的动作!移除rm (remove)指令。 cp (复制文件或目录)[root@study ~]# cp [-adfilprsu] 来源文件(source) 目标文件(destination) [root@study ~]# cp [options] source1 source2 source3 .... directory 选项与参数: -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 等也复制了。 最后需要注意的,如果来源文件有两个以上,则最后一个目的文件一定要是“目录”才行! 范例一:用root身份,将主文件夹下的 .bashrc 复制到 /tmp 下,并更名为 bashrc [root@study ~]# cp ~/.bashrc /tmp/bashrc [root@study ~]# cp -i ~/.bashrc /tmp/bashrc cp: overwrite/tmp/bashrc’? n <==n不覆盖,y为覆盖 # 重复作两次动作,由于 /tmp 下面已经存在 bashrc 了,加上 -i 选项后, # 则在覆盖前会询问使用者是否确定!可以按下 n 或者 y 来二次确认呢! 范例二:变换目录到/tmp,并将/var/log/wtmp复制到/tmp且观察属性: [root@study ~]# cd /tmp [root@study tmp]# cp /var/log/wtmp . <==想要复制到目前的目录,最后的 . 不要忘 [root@study tmp]# ls –l /var/log/wtmp wtmp -rw-rw-r–. 1 root utmp 28416 Jun 11 18:56 /var/log/wtmp -rw-r–r--. 1 root root 28416 Jun 11 19:01 wtmp # 注意上面的特殊字体,在不加任何选项的情况下,文件的某些属性/权限会改变; # 这是个很重要的特性!要注意喔!还有,连文件创建的时间也不一样了! # 那如果你想要将文件的所有特性都一起复制过来该怎办?可以加上 -a 喔!如下所示: [root@study tmp]# cp -a /var/log/wtmp wtmp_2 [root@study tmp]# ls -l /var/log/wtmp wtmp_2 -rw-rw-r–. 1 root utmp 28416 Jun 11 18:56 /var/log/wtmp -rw-rw-r–. 1 root utmp 28416 Jun 11 18:56 wtmp_2 #整个数据特性完全一模一样 范例三:复制 /etc/ 这个目录下的所有内容到 /tmp 下面 [root@study tmp]# cp /etc/ /tmp cp: omitting directory /etc' <== 如果是目录则不能直接复制,要加上 -r 的选项 [root@study tmp]# cp -r /etc/ /tmp # 还是要再次的强调喔! -r 是可以复制目录,但是,文件与目录的权限可能会被改变 # 所以,也可以利用“ cp -a /etc /tmp ”来下达指令喔!尤其是在备份的情况下! 范例四:将范例一复制的 bashrc 创建一个链接文件 (symbolic link) [root@study tmp]# ls -l bashrc -rw-r--r--. 1 root root 176 Jun 11 19:01 bashrc <==先观察一下文件情况 [root@study tmp]# cp -s bashrc bashrc_slink [root@study tmp]# cp -l bashrc bashrc_hlink [root@study tmp]# ls -l bashrc* -rw-r--r--. 2 root root 176 Jun 11 19:01 bashrc <==与原始文件不太一样了! -rw-r--r--. 2 root root 176 Jun 11 19:01 bashrc_hlink lrwxrwxrwx. 1 root root 6 Jun 11 19:06 bashrc_slink -> bashrc 使用 -l 及 -s 都会创建所谓的链接文件(link file),但是这两种链接文件却 有不一样的情况。-l是所谓的实体链接(hard link),至于 -s 则是符号链接(symbolic link), 简单来说,bashrc_slink 是一个“捷径”,这个捷径会链接到 bashrc去!所以你会看到文件名右侧会有个指向(->)的符号! 范例五:若 ~/.bashrc 比 /tmp/bashrc 新才复制过来 [root@study tmp]# cp -u ~/.bashrc /tmp/bashrc # 这个 -u 的特性,是在目标文件与来源文件有差异时,才会复制的。 # 所以,比较常被用于“备份”的工作当中喔! 范例六:将范例四造成的 bashrc_slink 复制成为 bashrc_slink_1 与bashrc_slink_2 [root@study tmp]# cp bashrc_slink bashrc_slink_1 [root@study tmp]# cp -d bashrc_slink bashrc_slink_2 [root@study tmp]# ls -l bashrc bashrc_slink* -rw-r--r--. 2 root root 176 Jun 11 19:01 bashrc lrwxrwxrwx. 1 root root 6 Jun 11 19:06 bashrc_slink -> bashrc -rw-r--r--. 1 root root 176 Jun 11 19:09 bashrc_slink_1 <==与原始文件相同 lrwxrwxrwx. 1 root root 6 Jun 11 19:10 bashrc_slink_2 -> bashrc <==是链接文件! #原本复制的是链接文件,但是却将链接文件的实际文件复制过来了 # 也就是说,如果没有加上任何选项时,cp复制的是原始文件,而非链接文件的属性! # 若要复制链接文件的属性,就得要使用 -d 的选项了!如 bashrc_slink_2 所示。 范例七:将主文件夹的 .bashrc 及 .bash_history 复制到 /tmp 下面 [root@study tmp]# cp ~/.bashrc ~/.bash_history /tmp # 可以将多个数据一次复制到同一个目录去!最后面一定是目录! 例题:你能否使用 dmtsai 的身份,完整的复制/var/log/wtmp文件到/tmp下面,并更名为 dmtsai_wtmp呢?答:实际做看看的结果如下: [dmtsai@study ~]$ cp -a /var/log/wtmp /tmp/dmtsai_wtmp [dmtsai@study ~]$ ls -l /var/log/wtmp /tmp/dmtsai_wtmp -rw-rw-r--. 1 dmtsai dmtsai 28416 6月 11 18:56 /tmp/dmtsai_wtmp -rw-rw-r--. 1 root utmp 28416 6月 11 18:56 /var/log/wtmp由于 dmtsai 的身份并不能随意修改文件的拥有者与群组,因此虽然能够复制wtmp的相关权限 与时间等属性, 但是与拥有者、群组相关的,原本 dmtsai 身份无法进行的动作,即使加上 - a 选项,也是无法达成完整复制权限的! rm (移除文件或目录)[root@study ~]# rm [-fir] 文件或目录 选项与参数: -f :就是 force 的意思,忽略不存在的文件,不会出现警告讯息; -i :互动模式,在删除前会询问使用者是否动作 -r :递回删除啊!最常用在目录的删除了!这是非常危险的选项!!! 范例一:将刚刚在 cp 的范例中创建的 bashrc 删除掉! [root@study ~]# cd /tmp [root@study tmp]# rm -I bashrc rm: remove regular filebashrc’? y # 如果加上 -i 的选项就会主动询问喔,避免你删除到错误的文件名! 范例二:通过万用字符的帮忙,将/tmp下面开头为bashrc的文件名通通删除: [root@study tmp]# rm -i bashrc # 注意那个星号,代表的是 0 到无穷多个任意字符。 范例三:将 cp 范例中所创建的 /tmp/etc/ 这个目录删除掉! [root@study tmp]# rmdir /tmp/etc rmdir: failed to remove ‘/tmp/etc’: Directory not empty <== 删不掉啊!因为这不是空的目录! [root@study tmp]# rm –r /tmp/etc rm: descend into directory /tmp/etc'? y rm: remove regular file/tmp/etc/fstab’? y rm: remove regular empty file /tmp/etc/crypttab'? ^C <== 按下 [crtl]+c 中断 .....(中间省略)..... # 因为身份是 root ,默认已经加入了 -i 的选项,所以你要一直按 y 才会删除! # 如果不想要继续按 y ,可以按下“ [ctrl]-c ”来结束 rm 的工作。 # 这是一种保护的动作,如果确定要删除掉此目录而不要询问,可以这样做: [root@study tmp]# \rm -r /tmp/etc # 在指令前加上反斜线,可以忽略掉 alias 的指定选项喔!# 拜托!这个范例很可怕!你不要删错了!删除 /etc 系统是会挂掉的! 范例四:删除一个带有 - 开头的文件 [root@study tmp]# touch ./-aaa- <==[touch](../Text/index.html#touch)这个指令可以创建空文件! [root@study tmp]# ls -l -rw-r--r--. 1 root root 0 Jun 11 19:22 -aaa- <==文件大小为0,所以是空文件 [root@study tmp]# rm –aaarm: invalid option -- 'a' <== 因为 "-" 是选项嘛!所以系统误判了! Try 'rm ./-aaa-' to remove the file-aaa-’. <== 新的 bash 有给建议的 Try ‘rm --help’ for more information. [root@study tmp]# rm ./-aaa- mv (移动文件与目录,或更名)[root@study ~]# mv [-fiu] source destination [root@study ~]# mv [options] source1 source2 source3 … directory 选项与参数: -f :force 强制的意思,如果目标文件已经存在,不会询问而直接覆盖; -i :若目标文件 (destination)已经存在时,就会询问是否覆盖! -u :若目标文件已经存在,且 source 比较新,才会更新 (update) 范例一:复制一文件,创建一目录,将文件移动到目录中 [root@study ~]# cd /tmp [root@study tmp]# cp ~/.bashrc bashrc [root@study tmp]# mkdir mvtest [root@study tmp]# mv bashrc mvtest #将某个文件移动到某个目录去,就是这样做! 范例二:将刚刚的目录名称更名为 mvtest2 [root@study tmp]# mv mvtest mvtest2 <== 这样就更名了! # 其实在 Linux 下面还有个有趣的指令,名称为 rename , # 该指令专职进行多个文件名的同时更名,并非针对单一文件名变更,与mv不同。请man rename。 范例三:再创建两个文件,再全部移动到 /tmp/mvtest2 当中 [root@study tmp]# cp ~/.bashrc bashrc1 [root@study tmp]# cp ~/.bashrc bashrc2 [root@study tmp]# mv bashrc1 bashrc2 mvtest2 # 注意到这边,如果有多个来源文件或目录,则最后一个目标文件一定是“目录!” # 意思是说,将所有的数据移动到该目录的意思! 在 Linux 才有的指令当中,有个 rename , 可以用来更改大量文件的文件名 取得路径的文件名称与目录名称basename 与 dirname 的用途[root@study ~]# basename /etc/sysconfig/network network <== 很简单!就取得最后的文件名~ [root@study ~]# dirname /etc/sysconfig/network /etc/sysconfig <== 取得的变成目录名!文件内容查阅cat 由第一行开始显示文件内容 tac 从最后一行开始显示,可以看出 tac 是 cat 的倒着写! nl 显示的时候,顺道输出行号! more 一页一页的显示文件内容 less 与 more 类似,但是比 more 更好的是,他可以往前翻页!head 只看头几行 tail 只看尾巴几行 od 以二进制的方式读取文件内容! 直接检视文件内容直接查阅一个文件的内容可以使用 cat/tac/nl 这几个指令cat (concatenate)[root@study ~]# cat [-AbEnTv] 选项与参数: -A :相当于 -vET 的整合选项,可列出一些特殊字符而不是空白而已; -b :列出行号,仅针对非空白行做行号显示,空白行不标行号! -E :将结尾的断行字符 $ 显示出来; -n :打印出行号,连同空白行也会有行号,与 -b 的选项不同; -T :将 [tab] 按键以 ^I 显示出来; -v :列出一些看不出来的特殊字符 范例一:检阅 /etc/issue 这个文件的内容 [root@study ~]# cat /etc/issue \S Kernel \r on an \m 范例二:承上题,如果还要加印行号呢? [root@study ~]# cat -n /etc/issue 1 \S 2 Kernel \r on an \m 3 # 所以这个文件有三行!可以印出行号呢!这对于大文件要找某个特定的行时,有点用处! # 如果不想要编排空白行的行号,可以使用“cat -b /etc/issue”,自己测试看看: 范例三:将 /etc/man_db.conf 的内容完整的显示出来(包含特殊字符) [root@study ~]# cat -A /etc/man_db.conf # $ …(中间省略)… MANPATH_MAPI/binIII/usr/share/man$ MANPATH_MAPI/usr/binI^I/usr/share/man$ MANPATH_MAPI/sbinIII/usr/share/man$ MANPATH_MAPI/usr/sbinI^I/usr/share/man$ …(下面省略)… # 上面的结果限于篇幅,删除掉很多数据。另外,输出的结果并不会有特殊字体, tac (反向列示)[root@study ~]# tac /etc/issue Kernel \r on an \m \S # 嘿嘿!与刚刚上面的范例一比较,是由最后一行先显示喔! nl (添加行号打印)[root@study ~]# nl [-bnw] 文件 选项与参数: -b :指定行号指定的方式,主要有两种: -b a :表示不论是否为空行,也同样列出行号(类似 cat -n); -b t :如果有空行,空的那一行不要列出行号(默认值); -n :列出行号表示的方法,主要有三种: -n ln :行号在屏幕的最左方显示; -n rn :行号在自己字段的最右方显示,且不加 0 ; -n rz :行号在自己字段的最右方显示,且加 0 ; -w :行号字段的占用的字符数。 范例一:用 nl 列出 /etc/issue 的内容 [root@study ~]# nl /etc/issue 1 \S 2 Kernel \r on an \m # 注意看,这个文件其实有三行,第三行为空白(没有任何字符), # 因为他是空白行,所以 nl 不会加上行号喔!如果确定要加上行号,可以这样做: [root@study ~]# nl -b a /etc/issue 1 \S 2 Kernel \r on an \m 3 #那么如果要让行号前面自动补上 0 呢?可这样 [root@study ~]# nl -b a -n rz /etc/issue 000001 \S 000002 Kernel \r on an \m 000003 # 嘿嘿!自动在自己字段的地方补上 0 了~默认字段是六位数,如果想要改成 3 位数? [root@study ~]# nl -b a -n rz -w 3 /etc/issue 001 \S 002 Kernel \r on an \m 003 # 变成仅有 3 位数啰~nl 可以将输出的文件内容自动的加上行号!其默认的结果与 cat -n 有点不太一样, nl 可以将 行号做比较多的显示设计,包括位数与是否自动补齐 0 等等的功能呢。 可翻页检视more (一页一页翻动)[root@study ~]# more /etc/man_db.conf # # # This file is used by the man-db package to configure the man and cat paths. # It is also used to provide a manpath for those without one by examining # their PATH environment variable. For details see the manpath(5) man page. # …(中间省略)… --More–(28%) <== 重点在这一行喔!你的光标也会在这里等待你的指令。如果 more 后面接的文件内容行数大于屏幕输出的行数时,就会出现类似上面的情况。 重点在最后一行,最后一行会显示出目前显示的百分比,而且还可以在最后一行输入一些有用的指令!在 more 这个程序的运行过程中,你有几个按键可以按的: 空白键 (space):代表向下翻一页; Enter :代表向下翻“一行”; /字串 :代表在这个显示的内容当中,向下搜寻“字串”这个关键字; :f :立刻显示出文件名以及目前显示的行数; q :代表立刻离开 more ,不再显示该文件内容。 b 或 [ctrl]-b :代表往回翻页,不过这动作只对文件有用,对管线无用。 我们使用“ more /etc/man_db.conf ”来观察该文件,若想要在该文件内搜寻 MANPATH 这个字串时,可以这样做:[root@study ~]# more /etc/man_db.conf ## # This file is used by the man-db package to configure the man and cat paths. # It is also used to provide a manpath for those without one by examining # their PATH environment variable. For details see the manpath(5) man page. # …(中间省略)… /MANPATH <== 输入了 / 之后,光标就会自动跑到最下面一行等待输入!输入了 / 之后,光标就会跑到最下面一行,并且等待的输入,输入了字串并按下[enter]之后! more 就会开始向下搜寻该字串,而重复搜寻同一个字串,可以直接按下 n 即可!最后,不想要看了,就按下 q 即可离开 more 啦! less (一页一页翻动)[root@study ~]# less /etc/man_db.conf # # # This file is used by the man-db package to configure the man and cat paths. # It is also used to provide a manpath for those without one by examining # their PATH environment variable. For details see the manpath(5) man page. # …(中间省略)… : <== 这里可以等待你输入指令! less 的用法比起 more 又更加的有弹性,在 more 的时候,我们并没有办法向前面翻, 只能往后面看,但若使用了 less 时,就可以使用 [pageup] [pagedown] 等按键的功能来往前往后翻看文件, 除此之外,在 less 里头可以拥有更多的“搜寻”功能喔!可以输入的指令有: 空白键 :向下翻动一页; [pagedown]:向下翻动一页; [pageup] :向上翻动一页; /字串 :向下搜寻“字串”的功能; ?字串 :向上搜寻“字串”的功能; n :重复前一个搜寻 (与 / 或 ? 有关!) N :反向的重复前一个搜寻 (与 / 或 ? 有关!) g :前进到这个数据的第一行去; G :前进到这个数据的最后一行去 (注意大小写); q :离开 less 这个程序; 数据撷取head (取出前面几行)[root@study ~]# head [-n number] 文件 选项与参数: -n :后面接数字,代表显示几行的意思 [root@study ~]# head /etc/man_db.conf # 默认的情况中,显示前面十行!若要显示前 20 行,就得要这样: [root@study ~]# head -n 20 /etc/man_db.conf 范例:如果后面100行的数据都不打印,只打印/etc/man_db.conf的前面几行。[root@study ~]# head -n -100 /etc/man_db.conf-n 选项后面的参数如果接的是负数,例如上面范例的-n -100时,代表列前的所有行数,但不包括后面100行。 tail (取出后面几行)[root@study ~]# tail [-n number] 文件 选项与参数: -n :后面接数字,代表显示几行的意思 -f :表示持续侦测后面所接的文件名,要等到按下[ctrl]-c才会结束tail的侦测 [root@study ~]# tail /etc/man_db.conf # 默认的情况中,显示最后的十行!若要显示最后的 20 行,就得要这样: [root@study ~]# tail -n 20 /etc/man_db.conf 范例一:如果不知道/etc/man_db.conf有几行,却只想列出100行以后的数据时? [root@study ~]# tail -n +100 /etc/man_db.conf 范例二:持续侦测/var/log/message的内容 [root@study ~]# tail -f /var/log/messages <==要等到输入[crtl]-c之后才会离开tail这个指令的侦测! 例题:假如我想要显示 /etc/man_db.conf 的第 11 到第 20 行呢?答:在第 11 到第 20 行,那么我取前 20 行,再取后十行,所以结果就是:“ head -n 20 /etc/man_db.conf | tail -n 10 ”,这样就可以得到第 11 到第 20 行之间的内容了!注:这两个指令中间有个管线 (|) 的符号存在,这个管线的意思是:“前面的指令所输出的讯息,请通过管线交由后续的指令继续使用”的意思。 所以, head -n 20 /etc/man_db.conf 会将文件内的 20 行取出来,但不输出到屏幕上,而是转交给后续的 tail 指令继续处理。因此 tail “不需要接文件名”,因为 tail 所需要的数据是来自于 head 处理后的结果! 例题:承上一题,那如果我想要列出正确的行号呢?就是屏幕上仅列出 /etc/man_db.conf 的 第 11 到第 20 行,且有行号存在?答:我们可以通过 cat -n 来带出行号,然后再通过 head/tail 来撷取数据即可!所以就变成如下的模样了: cat -n /etc/man_db.conf | head -n 20 | tail -n 10 非纯文本文件: od[root@study ~]# od [-t TYPE] 文件 选项或参数: -t :后面可以接各种“类型 (TYPE)”的输出,例如: a :利用默认的字符来输出; c :使用 ASCII 字符来输出 d[size] :利用十进制(decimal)来输出数据,每个整数占用 size Bytes ; f[size] :利用浮点数值(floating)来输出数据,每个数占用 size Bytes ; o[size] :利用八进位(octal)来输出数据,每个整数占用 size Bytes ; x[size] :利用十六进制(hexadecimal)来输出数据,每个整数占用 size Bytes ; 范例一:请将/usr/bin/passwd的内容使用ASCII方式来展现! [root@study ~]# od -t c /usr/bin/passwd 0000000 177 E L F 002 001 001 \0 \0 \0 \0 \0 \0 \0 \0 \0 0000020 003 \0 > \0 001 \0 \0 \0 364 3 \0 \0 \0 \0 \0 \0 0000040 @ \0 \0 \0 \0 \0 \0 \0 x e \0 \0 \0 \0 \0 \0 0000060 \0 \0 \0 \0 @ \0 8 \0 \t \0 @ \0 035 \0 034 \0 0000100 006 \0 \0 \0 005 \0 \0 \0 @ \0 \0 \0 \0 \0 \0 \0 …(后面省略)… # 最左边第一栏是以 8 进位来表示Bytes数。以上面范例来说,第二栏0000020代表开头是 # 第 16 个 byes (2x8) 的内容之意。 修改文件时间或创建新文件: touch我们在 ls 这个指令的介绍时,有稍微提到每个文件在linux下面都会记录许多的时间参数, 其实是有三个主要的变动时间 modification time (mtime): 当该文件的“内容数据”变更时,就会更新这个时间!内容数据指的是文件的内容,而不是文件的属性或权限! status time (ctime): 当该文件的“状态 (status)”改变时,就会更新这个时间,举 例来说,像是权限与属性被更改了,都会更新这个时间啊。 access time (atime): 当“该文件的内容被取用”时,就会更新这个读取时间 (access)。举例来说,我们使用 cat 去读取 /etc/man_db.conf , 就会更新该文件的 atime 了。 看一看你自己的 /etc/man_db.conf 这个文件的时间:[root@study ~]# date; ls -l /etc/man_db.conf ; ls -l --time=atime /etc/man_db.conf ; \ >; ls -l --time=ctime /etc/man_db.conf # 这两行其实是同一行喔!用分号隔开 Tue Jun 16 00:43:17 CST 2015 # 目前的时间啊! -rw-r–r--. 1 root root 5171 Jun 10 2014 /etc/man_db.conf # 在 2014/06/10 创建的内容(mtime) -rw-r–r--. 1 root root 5171 Jun 15 23:46 /etc/man_db.conf # 在 2015/06/15 读取过内容(atime) -rw-r–r--. 1 root root 5171 May 4 17:54 /etc/man_db.conf # 在 2015/05/04 更新过状态(ctime)# 为了要让数据输出比较好看,将三个指令同时依序执行,三个指令中间用分号 (;) 隔开即可。 在默认的情况下,ls 显示出来的是该文件的 mtime ,也就是这个文件的内容上次 被更动的时间 Touch修改时间[root@study ~]# touch [-acdmt] 文件 选项与参数: -a :仅修订 access time; -c :仅修改文件的时间,若该文件不存在则不创建新文件; -d :后面可以接欲修订的日期而不用目前的日期,也可以使用 --date=“日期或时间” -m :仅修改 mtime ; -t :后面可以接欲修订的时间而不用目前的时间,格式为[YYYYMMDDhhmm] 范例一:新建一个空的文件并观察时间 [dmtsai@study ~]# cd /tmp [dmtsai@study tmp]# touch testtouch [dmtsai@study tmp]# ls -l testtouch -rw-rw-r–. 1 dmtsai dmtsai 0 Jun 16 00:45 testtouch # 注意到,这个文件的大小是 0!在默认的状态下,如果 touch 后面有接文件, # 则该文件的三个时间 (atime/ctime/mtime) 都会更新为目前的时间。若该文件不存在, # 则会主动的创建一个新的空的文件!例如上面这个例子! 范例二:将 ~/.bashrc 复制成为 bashrc,假设复制完全的属性,检查其日期 [dmtsai@study tmp]# cp -a ~/.bashrc bashrc [dmtsai@study tmp]# date; ll bashrc; ll --time=atime bashrc; ll --time=ctime bashrc Tue Jun 16 00:49:24 CST 2015 <==这是目前的时间 -rw-r–r--. 1 dmtsai dmtsai 231 Mar 6 06:06 bashrc <==这是 mtime -rw-r–r--. 1 dmtsai dmtsai 231 Jun 15 23:44 bashrc <==这是 atime -rw-r–r--. 1 dmtsai dmtsai 231 Jun 16 00:47 bashrc <==这是 ctime了“ll”这个指令(两个英文L的小写),这个指令其实就是“ls -l”的 意思, ll本身不存在,是被“做出来”的一个命令别名。ll=“ls -l” 范例三:修改案例二的 bashrc 文件,将日期调整为两天前 [dmtsai@study tmp]# touch -d “2 days ago” bashrc [dmtsai@study tmp]# date; ll bashrc; ll --time=atime bashrc; ll --time=ctime bashrc Tue Jun 16 00:51:52 CST 2015 -rw-r–r--. 1 dmtsai dmtsai 231 Jun 14 00:51 bashrc -rw-r–r--. 1 dmtsai dmtsai 231 Jun 14 00:51 bashrc -rw-r–r--. 1 dmtsai dmtsai 231 Jun 16 00:51 bashrc # 跟上个范例比较看看,本来是 16 日变成 14 日了 (atime/mtime)~不过, ctime 并没有跟着改变! 范例四:将上个范例的 bashrc 日期改为 2014/06/15 2:02 [dmtsai@study tmp]# touch -t 201406150202 bashrc [dmtsai@study tmp]# date; ll bashrc; ll --time=atime bashrc; ll --time=ctime bashrc Tue Jun 16 00:54:07 CST 2015 -rw-r–r--. 1 dmtsai dmtsai 231 Jun 15 2014 bashrc -rw-r–r--. 1 dmtsai dmtsai 231 Jun 15 2014 bashrc -rw-r–r--. 1 dmtsai dmtsai 231 Jun 16 00:54 bashrc # 注意看看,日期在 atime 与 mtime 都改变了,但是 ctime 则是记录目前的时间! 通过 touch 这个指令,我们可以轻易的修订文件的日期与时间。并且也可以创建一个空的文件!不过,要注意的是,即使我们复制一个文件时,复制所有的属性,但也没有办法复制 ctime 这个属性的。 ctime 可以记录这个文件最近的状态 (status)被改变的时间。 文件与目录的默认权限与隐藏权限除了基本r, w, x权限外,在Linux传统的Ext2/Ext3/Ext4文件系统下,我们还可以设置其他的系统隐藏属性, 这部份可使用 chattr 来设置,而以 lsattr 来查看,最重要的属性就是可以设置其不可修改的特性!让连文件的拥有者都不能进行修改! 这个属性可是相当重要的,尤其是在安全机制上面 (security)! 例题:你的系统有个一般身份使用者 dmtsai,他的群组属于 dmtsai,他的主文件夹在 /home/dmtsai, 你是root,你想将你的 ~/.bashrc 复制给他,可以怎么作?答:由之前的权限概念我们可以知道 root 虽然可以将这个文件复制给 dmtsai,不过这个文件在 dmtsai 的主文件夹中却可能让 dmtsai 没有办法读写(因为该文件属于 root !而 dmtsai 又不能使用 chown)。 此外,我们又担心覆盖掉 dmtsai 自己的 .bashrc 配置文件,因此,我们可以 进行如下的动作: 复制文件: cp ~/.bashrc ~dmtsai/bashrc 修改属性: chown dmtsai:dmtsai ~dmtsai/bashrc 例题:我想在 /tmp 下面创建一个目录,这个目录名称为 chapter6_1 ,并且这个目录拥有者为 dmtsai, 群组为 dmtsai,此外,任何人都可以进入该目录浏览文件,不过除了 dmtsai 之外,其他人都不能修改该目录下的文件。答:因为除了 dmtsai 之外,其他人不能修改该目录下的文件,所以整个目录的权限应该是 drwxr-xr-x 才对!因此应该这样做:创建目录: mkdir /tmp/chapter6_1 修改属性: chown -R dmtsai:dmtsai /tmp/chapter6_1 修改权限: chmod -R 755 /tmp/chapter6_1 文件默认权限:umask[root@study ~]# umask 0022 <==与一般权限有关的是后面三个数字! [root@study ~]# umask -S u=rwx,g=rx,o=rx查阅的方式有两种,一种可以直接输入 umask ,就可以看到数字体态的权限设置分数, 一种则是加入 -S (Symbolic) 这个选项,就会以符号类型的方式来显示出权限了! 文件隐藏属性chattr (设置文件隐藏属性)chattr指令只能在Ext2/Ext3/Ext4的 Linux 传统文件系统上面完整生效,其他的文件系统可能就无法完整的支持这个指令。[root@study ~]# chattr [±=][ASacdistu] 文件或目录名称 选项与参数: + :增加某一个特殊参数,其他原本存在参数则不动。 - :移除某一个特殊参数,其他原本存在参数则不动。 = :设置一定,且仅有后面接的参数 A :当设置了 A 这个属性时,若你有存取此文件(或目录)时,他的存取时间 atime 将不会被修改, 可避免 I/O 较慢的机器过度的存取磁盘。(目前建议使用文件系统挂载参数处理这个项目) S :一般文件是非同步写入磁盘的,如果加上 S 这个属性时, 当你进行任何文件的修改,该更动会“同步”写入磁盘中。 a :当设置 a 之后,这个文件将只能增加数据,而不能删除也不能修改数据,只有root 才能设置这属性 c :这个属性设置之后,将会自动的将此文件“压缩”,在读取的时候将会自动解压缩,但是在储存的时候,将会先进行压缩后再储存(看来对于大文件似乎蛮有用的!) d :当 dump 程序被执行的时候,设置 d 属性将可使该文件(或目录)不会被 dump 备份 i :可以让一个文件“不能被删除、改名、设置链接也无法写入或新增数据!” 对于系统安全性有相当大的助益!只有 root 能设置此属性 s :当文件设置了 s 属性时,如果这个文件被删除,他将会被完全的移除出这个硬盘空间,所以如果误删了,完全无法救回来了! u :与 s 相反的,当使用 u 来设置文件时,如果该文件被删除了,则数据内容其实还存在磁盘中,可以使用来救援该文件! 注意1:属性设置常见的是 a 与 i 的设置值,而且很多设置值必须要身为 root 才能设置 注意2:xfs 文件系统仅支持 AadiS 而已 范例:请尝试到/tmp下面创建文件,并加入 i 的参数,尝试删除看看。 [root@study ~]# cd /tmp [root@study tmp]# touch attrtest <==创建一个空文件 [root@study tmp]# chattr +i attrtest <==给予 i 的属性 [root@study tmp]# rm attrtest <==尝试删除看看 rm: remove regular empty file attrtest'? y rm: cannot removeattrtest’: Operation not permitted #连 root 也没有办法将这个文件删除呢!解除设置! 范例:请将该文件的 i 属性取消! [root@study tmp]# chattr -i attrtest lsattr (显示文件隐藏属性)[root@study ~]# lsattr [-adR] 文件或目录 选项与参数: -a :将隐藏文件的属性也秀出来; -d :如果接的是目录,仅列出目录本身的属性而非目录内的文件名; -R :连同子目录的数据也一并列出来! [root@study tmp]# chattr +aiS attrtest [root@study tmp]# lsattr attrtest --S-ia---------- attrtest 观察文件类型:file[root@study ~]# file ~/.bashrc /root/.bashrc: ASCII text <告诉我们是 ASCII 的纯文本文件啊! [root@study ~]# file /usr/bin/passwd /usr/bin/passwd: setuid ELF 64-bit LSB shared object, x86-64, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.32, BuildID[sha1]=0xbf35571e607e317bf107b9bcf65199988d0ed5ab, stripped # 可执行文件的数据可就多的不得了!包括这个文件的 suid 权限、相容于 Intel x86-64 等级的硬件平台 # 使用的是 Linux 核心 2.6.32 的动态函数库链接等等。 [root@study ~]# file /var/lib/mlocate/mlocate.db /var/lib/mlocate/mlocate.db: data < 这是 data 文件! 指令与文件的搜寻which (寻找“可执行文件”)[root@study ~]# which [-a] command 选项或参数: -a :将所有由 PATH 目录中可以找到的指令均列出,而不止第一个被找到的指令名称 范例一:搜寻 ifconfig 这个指令的完整文件名 [root@study ~]# which ifconfig /sbin/ifconfig 范例二:用 which 去找出 which 的文件名为何? [root@study ~]# which which alias which=‘alias | /usr/bin/which --tty-only --read-alias --show-dot --show-tilde’ /bin/alias /usr/bin/which # 竟然会有两个 which ,其中一个是 alias ,就是所谓的“命令别名”,意思是输入 which 会等于后面接的那串指令啦! 范例三:请找出 history 这个指令的完整文件名 [root@study ~]#which history /usr/bin/which: no history in (/usr/local/sbin:/usr/local/bin:/sbin:/bin: /usr/sbin:/usr/bin:/root/bin)[root@study ~]# history --help -bash: history: --: invalid option history: usage: history [-c] [-d offset] [n] or history -anrw [filename] or history -ps arg # 瞎密?怎么可能没有 history ,我明明就能够用 root 执行 history 的啊! 这个指令是根据“PATH”这个环境变量所规范的路径,去搜寻“可执行文件”的文件名~ 所以, 重点是找出“可执行文件”而已!且 which 后面接的是“完整文件名”!若加上 -a 选项,则可以列出所有的可以找到的同名可执行文件,而非仅显示第一个而已! 最后一个范例最有趣,怎么 history 这个常用的指令竟然找不到啊!为什么呢?这是因为 history 是“bash 内置的指令”啦!但是 which 默认是找 PATH 内所规范的目录,所以当然一定找不到的啊(有 bash 就有 history!)! 文件文件名的搜寻通常 find 不很常用的!因为速度慢之外,也很操硬盘!一般我们都是先使用 whereis 或者是 locate 来检查,如果真的找不到了,才以 find 来搜寻!为什么呢?因为 whereis 只找系统中某些特定目录下面的文件而已,locate 则是利用数据库来搜寻文件名,当然两者就相当的快速,且没有实际的搜寻硬盘内的文件系统状态,比较省时间啦! whereis (由一些特定的目录中寻找文件文件名)[root@study ~]# whereis [-bmsu] 文件或目录名 选项与参数: -l :可以列出 whereis 会去查询的几个主要目录而已 -b :只找 binary 格式的文件 -m :只找在说明文档 manual 路径下的文件 -s :只找 source 来源文件 -u :搜寻不在上述三个项目当中的其他特殊文件 范例一:请找出 ifconfig 这个文件名 [root@study ~]# whereis ifconfig ifconfig: /sbin/ifconfig /usr/share/man/man8/ifconfig.8.gz 范例二:只找出跟 passwd 有关的“说明文档”文件名(man page) [root@study ~]# whereis passwd passwd:/usr/bin/passwd /etc/passwd /usr/share/man/man1/passwd.1.gz /usr/share/man/man5/passwd.5.gz# 全部的文件名通通列出来! [root@study ~]# whereis -m passwd passwd: /usr/share/man/man1/passwd.1.gz /usr/share/man/man5/passwd.5.gz# 只有在 man 里面的文件名才抓出来! find 是很强大的搜寻指令,但时间花用的很大!(因为 find 是直接搜寻硬盘) 这个时候 whereis 就相当的好用了!另外, whereis 可以加入选项来找寻相关的数据,例如,如果你是要找可可执行文件 (binary) 那么加上 -b 就可以啦! 如果不加任何选项的话,那么就将所有的数据列出来啰! whereis 只找几个特定的目录而已~并没有全系统去查询。所以说, whereis 主要是针对 /bin /sbin 下面的可执行文件, 以及 /usr/share/man 下面的 man page 文件,跟几个比较特定的目录来处理而已。所以速度快的多!不过,就有某些文件是你找不到的! 想要知道 whereis 到底查了多少目录?可以使用 whereis -l 来确认一下即可! locate / updated[root@study ~]# locate [-ir] keyword 选项与参数: -i :忽略大小写的差异; -c :不输出文件名,仅计算找到的文件数量 -l :仅输出几行的意思,例如输出五行则是 -l 5 -S :输出 locate 所使用的数据库文件的相关信息,包括该数据库纪录的文件/目录数量等 -r :后面可接正则表达式的显示方式 范例一:找出系统中所有与 passwd 相关的文件名,且只列出 5 个 [root@study ~]# locate -l 5 passwd /etc/passwd /etc/passwd- /etc/pam.d/passwd /etc/security/opasswd /usr/bin/gpasswd 范例二:列出 locate 查询所使用的数据库文件之文件名与各数据数量 [root@study ~]# locate -S Database /var/lib/mlocate/mlocate.db: 8,086 directories # 总纪录目录数 109,605 files # 总纪录文件数 5,190,295 Bytes in file names 2,349,150 Bytes used to store database用 locate 来寻找数据的时候特别的快,因为 locate 寻找的数据是由“已创建的数据库 /var/lib/mlocate/” 里面的数据所搜寻到的,所以不用直接在去硬盘当中存取数据。经由数据库来搜寻的,而数据库的创建默认是在每天执行一次。所以当你新创建 起来的文件, 却还在数据库更新之前搜寻该文件,那么 locate 会告诉你“找不到!”因为必须要更新数据库!更新 locate 数据库的方法非常简单,直接输入“ updatedb ”就可以了! updatedb 指令会去读取 /etc/updatedb.conf 这个配置文件的设置,然后再去硬盘里面进行搜寻文件名的动作, 最后就更新整个数据库文件!因为 updatedb 会去搜寻硬盘,所以当你执行 updatedb 时,可能会等待数分钟的时间喔! updatedb:根据 /etc/updatedb.conf 的设置去搜寻系统硬盘内的文件名,并更新 /var/lib/mlocate 内的数据库文件; locate:依据 /var/lib/mlocate 内的数据库记载,找出使用者输入的关键字文件名。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值