Linux 档案与目录管理

绝对路径:

路径的写法『一定由根目录 / 写起』,例如: /usr/share/doc 这个目录。

相对路径:

路径的写法『不是由 / 写起』,例如由 /usr/share/doc 要到 /usr/share/man 底下
时,可以写成: 『cd ../man』这就是相对路径的写法啦!相对路径意指『相对于目前工作目录
的路径!』

. 代表此层目录

.. 代表上一层目录

- 代表前一个工作目录

~ 代表『目前使用者身份』所在的家目录

~account 代表 account 这个使用者的家目录



./

. 在这里表示的是当前目录,就像 .. 表示上级目录一样。
这个 / 表示的是目录级别的分隔符,他之前的就是目录名,./aaa/ 表明的就是 . (也就是当前目录)下面的 aaa 目录。当然这个 aaa 后面的 / 可以省略,就像 ./ 表示当前目录时,其实 / 是不需要的。
对应的 ./bbb 表示的是当前目录下面的 bbb 文件,但也可以表示 bbb 这个目录,区别就在于这个 bbb 是文件还是目录

/

目录一般都在后面加 / 来表示。尤其是鉴于 . 这个符号太过常用,单拿出来容易引起混乱,所以大家都用 ./ 表示当前目录。同样的 xxxx/ 表示 xxxx 目录。

处理目录的指令

cd:变换目录:Change Directory 的缩写

dmtsai 这个使用者的家目录是 /home/dmtsai ,而 root 家目录则是/root。

[root@linux ~]# cd [相对路径或绝对路径]
# 最重要的就是目录的绝对路径与相对路径,还有一些特殊目录的符号啰!
[root@linux ~]# cd ~dmtsai
# 代表去到 dmtsai 这个使用者的家目录,亦即 /home/dmtsai
[root@linux dmtsai]# cd ~
# 表示回到自己的家目录,亦即是 /root 这个目录
[root@linux ~]# cd
# 没有加上任何路径,也还是代表回到自己家目录的意思喔!
[root@linux ~]# cd ..
# 表示去到目前的上层目录,亦即是 /root 的上层目录的意思;
[root@linux /]# cd -
# 表示回到刚刚的那个目录,也就是 /root 啰~
[root@linux ~]# cd /var/spool/mail
# 这个就是绝对路径的写法!直接指定要去的完整路径名称!
[root@linux mail]# cd ../mqueue
# 这个是相对路径的写法,我们由 /var/spool/mail 去到 /var/spool/mqueue 就这样写!


pwd:显示目前的目录:Print Working Directory 的缩写

[root@linux ~]# pwd [-P]
参数:
-P :显示出确实的路径,而非使用连结 (link) 路径。
范例:
[root@linux ~]# pwd
/root <== 显示出目录啦~
[root@linux ~]# cd /var/mail
[root@linux mail]# pwd
/var/mail
[root@linux mail]# pwd -P
/var/spool/mail <== 怎么回事?有没有加 -P 差很多~
[root@linux mail]# ls -l /var/mail
lrwxrwxrwx 1 root root 10 Jun 25 08:25 /var/mail -> spool/mail
# 看到这里应该知道为啥了吧?因为 /var/mail 是连结档,连结到 /var/spool/mail
# 所以,加上 pwd -P 的参数后,会不以连结文件的数据显示,而是显示正确的完整路径啊!

mkdir:建立一个新的目录

[root@linux ~]# mkdir [-mp] 目录名称
参数:
-m :设定档案的权限喔!直接设定,不需要看预设权限 (umask) 的脸色~
-p :帮助你直接将所需要的目录递归建立起来!
范例:
[root@linux ~]# cd /tmp
[root@linux tmp]# mkdir test <== 建立一名为 test 的新目录
[root@linux tmp]# mkdir test1/test2/test3/test4
mkdir: cannot create directory `test1/test2/test3/test4':
No such file or directory <== 没办法直接建立此目录啊!
[root@linux tmp]# mkdir -p test1/test2/test3/test4
# 加了这个 -p 的参数,可以自行帮您建立多层目录!
[root@linux tmp]# mkdir -m 711 test2
[root@linux tmp]# ls -l
drwxr-xr-x 3 root root 4096 Jul 18 12:50 test


rmdir:删除一个空的目录

[root@linux ~]# rmdir [-p] 目录名称
参数:
-p :连同上层『空的』目录也一起删除
范例:
[root@linux tmp]# ls -l
drwxr-xr-x 3 root root 4096 Jul 18 12:50 test
drwxr-xr-x 3 root root 4096 Jul 18 12:53 test1
drwx--x--x 2 root root 4096 Jul 18 12:54 test2
[root@linux tmp]# rmdir test
[root@linux tmp]# rmdir test1
rmdir: `test1': Directory not empty
[root@linux tmp]# rmdir -p test1/test2/test3/test4
[root@linux tmp]# ls -l
drwx--x--x 2 root root 4096 Jul 18 12:54 test2
# 瞧!利用 -p 这个参数,立刻就可以将 test1/test2/test3/test4 一次删除~
# 不过要注意的是,这个 rmdir 仅能『删除空的目录』

$PATH

『 为什么我可以在任何地方执行 /bin/ls 这个指令呢? 』对呀! 为什么我可以直接执行 ls 就一定可以显示出一
些讯息而不会说找不到该 /bin/ls 指令呢? 这是因为环境变量 PATH 的帮助所致呀!当我们在执行一个
指令的时候, 系统会依照 PATH 的设定去每个 PATH 定义的路径下搜寻执行文件,先搜寻到的指令先被执
行之!现在,请下达 echo $PATH , echo 有『显示、印出』的意思,而 PATH 前面加的 $ 表示后面接的
是变量,所以即会显示出目前的 PATH 了!

PATH 对于执行档来说,是个很重要的『变量』,他主要是用来规范指令搜寻的目录。 而每个目录是有顺序的,每个目录中间以冒
号『:』来分隔

[root@linux ~]# echo $PATH
/sbin:/usr/sbin:/bin:/usr/bin:/usr/X11R6/bin:/usr/local/bin:/usr/local/sbin


档案与目录管理:

档案与目录的检视: ls

[root@linux ~]# ls [-aAdfFhilRS] 目录名称
[root@linux ~]# ls [--color={none,auto,always}] 目录名称
[root@linux ~]# ls [--full-time] 目录名称
参数:
-a :全部的档案,连同隐藏档( 开头为 . 的档案) 一起列出来~
-A :全部的档案,连同隐藏档,但不包括 . 与 .. 这两个目录,一起列出来~
-d :仅列出目录本身,而不是列出目录内的档案数据
-f :直接列出结果,而不进行排序 (ls 预设会以档名排序!)
-F :根据档案、目录等信息,给予附加数据结构,例如:
*:代表可执行档; /:代表目录; =:代表 socket 档案; |:代表 FIFO 档案;
-h :将档案容量以人类较易读的方式(例如 GB, KB 等等)列出来;
-i :列出 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)

范例:

范例一:将家目录下的所有档案列出来(含属性与隐藏文件)
[root@linux ~]# ls -al ~
total 252
drwxr-x--- 9 root root 4096 Jul 16 23:40 .
drwxr-xr-x 24 root root 4096 Jul 16 23:45 ..
-rw------- 1 root root 1491 Jun 25 08:53 anaconda-ks.cfg
-rw------- 1 root root 12543 Jul 18 01:23 .bash_history
-rw-r--r-- 1 root root 24 Dec 4 2004 .bash_logout
-rw-r--r-- 1 root root 191 Dec 4 2004 .bash_profile
-rw-r--r-- 1 root root 395 Jul 4 11:45 .bashrc
-rw-r--r-- 1 root root 68495 Jun 25 08:53 install.log
-rw-r--r-- 1 root root 5976 Jun 25 08:53 install.log.syslog
drwx------ 2 root root 4096 Jul 4 16:03 .ssh
-rw------- 1 root root 12613 Jul 16 23:40 .viminfo
# 这个时候您会看到以 . 为开头的几个档案,以及目录文件 ./../.ssh 等等,
# 不过,目录文件都是以深蓝色显示,有点不容易看清楚就是了。
范例二:承上题,不显示颜色,但在文件名末显示出该文件名代表的类型(type)
[root@linux ~]# ls -alF --color=never ~
total 252
drwxr-x--- 9 root root 4096 Jul 16 23:40 ./
drwxr-xr-x 24 root root 4096 Jul 16 23:45 ../
-rw------- 1 root root 1491 Jun 25 08:53 anaconda-ks.cfg
-rw------- 1 root root 12543 Jul 18 01:23 .bash_history
-rw-r--r-- 1 root root 24 Dec 4 2004 .bash_logout
-rw-r--r-- 1 root root 191 Dec 4 2004 .bash_profile
-rw-r--r-- 1 root root 395 Jul 4 11:45 .bashrc
-rw-r--r-- 1 root root 68495 Jun 25 08:53 install.log
-rw-r--r-- 1 root root 5976 Jun 25 08:53 install.log.syslog
drwx------ 2 root root 4096 Jul 4 16:03 .ssh/
-rw------- 1 root root 12613 Jul 16 23:40 .viminfo
# 注意看到显示结果的第一行,嘿嘿~知道为何我们会下达类似 ./command
# 之类的指令了吧?因为 ./ 代表的是『目前目录下』的意思啊!至于什么是 FIFO/Socket ?
# 请参考前一章节的介绍啊!
范例三:完整的呈现档案的修改时间 *(modification time)
[root@linux ~]# ls -al --full-time ~
total 252
drwxr-x--- 9 root root 4096 2005-07-16 23:40:13.000000000 +0800 .
drwxr-xr-x 24 root root 4096 2005-07-16 23:45:05.000000000 +0800 ..
-rw------- 1 root root 1491 2005-06-25 08:53:37.000000000 +0800 anaconda-ks.cfg-rw------- 1 root root 12543 2005-07-18 01:23:33.000000000 +0800 .bash_history
-rw-r--r-- 1 root root 24 2004-12-04 05:44:13.000000000 +0800 .bash_logout
-rw-r--r-- 1 root root 191 2004-12-04 05:44:13.000000000 +0800 .bash_profile
-rw-r--r-- 1 root root 395 2005-07-04 11:45:16.000000000 +0800 .bashrc
-rw-r--r-- 1 root root 68495 2005-06-25 08:53:34.000000000 +0800 install.log
-rw-r--r-- 1 root root 5976 2005-06-25 08:53:28.000000000 +0800 install.log.syslog
drwx------ 2 root root 4096 2005-07-04 16:03:24.000000000 +0800 .ssh
-rw------- 1 root root 12613 2005-07-16 23:40:13.000000000 +0800 .viminfo
# 请仔细看,上面的『时间』字段变了喔!变成较为完整的格式。
# 一般来说, ls -al 仅列出目前短格式的时间,有时不会列出年份,
# 藉由 --full-time 可以查阅到比较正确的完整时间格式啊

复制、移动与删除: cp, rm, mv

cp (copy)(复制档案或目录)

要复制档案,请使用 cp (copy) 这个指令即可~不过, cp 这个指令的用途可多了~ 除了单纯的复制之
外,还可以建立连结档 (就是快捷方式啰),比对两档案的新旧而予以更新, 以及复制整个目录等等的功
能。

[root@linux ~]# cp [-adfilprsu] 来源档(source) 目的檔(destination)
[root@linux ~]# cp [options] source1 source2 source3 .... directory
参数:
-a :相当于 -pdr 的意思;
-d :若来源文件为连结文件的属性(link file),则复制连结文件属性而非档案本身;
-f :为强制 (force) 的意思,若有重复或其它疑问时,不会询问使用者,而强制复制;
-i :若目的檔(destination)已经存在时,在覆盖时会先询问是否真的动作!
-l :进行硬式连结 (hard link) 的连结档建立,而非复制档案本身;
-p :连同档案的属性一起复制过去,而非使用预设属性;
-r :递归持续复制,用于目录的复制行为;
-s :复制成为符号连结文件 (symbolic link),亦即『快捷方式』档案;
-u :若 destination 比 source 旧才更新 destination !最后需要注意的,如果来源档有两个以上,则最后一个目的文件一定要是『目录』才行!
范例:
范例一:将家目录下的 .bashrc 复制到 /tmp 下,并更名为 bashrc
[root@linux ~]# cd /tmp
[root@linux tmp]# cp ~/.bashrc bashrc
[root@linux tmp]# cp -i ~/.bashrc bashrc
cp: overwrite `basrhc'? n
# 重复作两次动作,由于 /tmp 底下已经存在 bashrc 了,加上 -i 参数,
# 则在覆盖前会询问使用者是否确定!可以按下 n 或者 y 呢!
# 但是,反过来说,如果不想要询问时,则加上 -f 这个参数来强制直接覆盖!
范例二:将 /var/log/wtmp 复制到 /tmp 底下
[root@linux tmp]# cp /var/log/wtmp . <==想要复制到目前的目录,最后的 . 不要忘
[root@linux tmp]# ls -l /var/log/wtmp wtmp
-rw-rw-r-- 1 root utmp 71808 Jul 18 12:46 /var/log/wtmp
-rw-r--r-- 1 root root 71808 Jul 18 21:58 wtmp
# 注意到了吗?!在不加任何参数的情况下,档案的所属者会改变,连权限也跟着改变了~
# 这是个很重要的特性!要注意喔!还有,连档案建立的时间也不一样了!
# 如果您想要将档案的所有特性都一起复制过来,可以加上 -a 喔!

[root@linux tmp]# cp -a /var/log/wtmp wtmp_2
[root@linux tmp]# ls -l /var/log/wtmp wtmp_2
-rw-rw-r-- 1 root utmp 71808 Jul 18 12:46 /var/log/wtmp
-rw-rw-r-- 1 root utmp 71808 Jul 18 12:46 wtmp_2
# 瞭了吧!整个资料特性完全一模一样ㄟ!真是不赖~这就是 -a 的特性!
范例三:复制 /etc/ 这个目录下的所有内容到 /tmp 底下
[root@linux tmp]# cp /etc/ /tmp
cp: omitting directory `/etc' <== 如果是目录,不能直接复制,要加上 -r 的参数
[root@linux tmp]# cp -r /etc/ /tmp
# 还是要再次的强调喔! -r 是可以复制目录,但是,档案与目录的权限会被改变~
# 所以,也可以利用 cp -a /etc /tmp 来下达指令喔!
范例四:将范例一复制的 bashrc 建立一个连结档 (symbolic link)
[root@linux tmp]# ls -l bashrc
-rw-r--r-- 1 root root 395 Jul 18 22:08 bashrc
[root@linux tmp]# cp -s bashrc bashrc_slink
[root@linux tmp]# cp -l bashrc bashrc_hlink
[root@linux tmp]# ls -l bashrc*
-rw-r--r-- 2 root root 395 Jul 18 22:08 bashrc
-rw-r--r-- 2 root root 395 Jul 18 22:08 bashrc_hlink
lrwxrwxrwx 1 root root 6 Jul 18 22:31 bashrc_slink -> bashrc
# 那个 bashrc_slink 是由 -s 的参数造成的,建立的是一个『快捷方式』,
# 所以您会看到在档案的最右边,会显示这个档案是『连结』到哪里去的!# 至于那个 bashrc_hlink 有趣了!建立了这个档案之后, bashrc 与 bashrc_hlink
# 所有的参数都一样,只是,第二栏的 link 数改变成为 2 了~而不是原本的 1 喔!
# 这两种连结的方式的异同,我们会在下一章里面进行介绍的!
范例五:若 ~/.bashrc 比 /tmp/bashrc 新才复制过来
[root@linux tmp]# cp -u ~/.bashrc /tmp/bashrc
# 这个 -u 的特性,是在目标档案与来源档案有差异时,才会复制的。
# 所以,比较常被用于『备份』的工作当中喔! ^_^
范例六:将范例四造成的 bashrc_slink 复制成为 bashrc_slink_2
[root@linux tmp]# cp bashrc_slink bashrc_slink_2
[root@linux tmp]# ls -l bashrc_slink*
lrwxrwxrwx 1 root root 6 Jul 18 22:31 bashrc_slink -> bashrc
-rw-r--r-- 1 root root 395 Jul 18 22:48 bashrc_slink_2
# 这个例子也是很有趣喔!原本复制的是连结档,但是却将连结档的实际档案复制过来了
# 也就是说,如果没有加上任何参数时,复制的是源文件,而非连结文件的属性!
# 若要复制连结文件的属性,就得要使用 -d 或者 -a 的参数了!
范例七:将家目录的 .bashrc 及 .bash_history 复制到 /tmp 底下
[root@linux tmp]# cp ~/.bashrc ~/.bash_history /tmp
# 可以将多个数据一次复制到同一个目录去!

主意:

当我们在进行备份的时候,某些需要特别注意的特殊权限档案, 例如密码文件
(/etc/shadow) 以及一些设定档,就不能直接以 cp 来复制,而必须要加上 -a 或者是 -p 等等可以完整
复制档案权限的参数才行!另外,如果您想要复制档案给其它的使用者, 也必须要注意到档案的权限(包
含读、写、执行以及档案拥有者等等), 否则,其它人还是无法针对您给予的档案进行修订的动作喔!

在复制时,您必须要清楚的了解到:
是否需要完整的保留来源档案的信息?
来源档案是否为连结档 (symbolic link file)?
来源档是否为特殊的档案,例如 FIFO, socket 等?
来源文件是否为目录

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

[root@linux ~]# mv [-fiu] source destination
[root@linux ~]# mv [options] source1 source2 source3 .... directory
参数:
-f :force 强制的意思,强制直接移动而不询问;
-i :若目标档案 (destination) 已经存在时,就会询问是否覆盖!
-u :若目标档案已经存在,且 source 比较新,才会更新 (update)
范例:
范例一:复制一档案,建立一目录,将档案移动到目录中
[root@linux ~]# cd /tmp
[root@linux tmp]# cp ~/.bashrc bashrc
[root@linux tmp]# mkdir mvtest
[root@linux tmp]# mv bashrc mvtest
# 将某个档案移动到某个目录去,就是这样做!
范例二:将刚刚的目录名称更名为 mvtest2
[root@linux tmp]# mv mvtest mvtest2 <== 这样就更名了!简单~
# 其实在 Linux 底下还有个有趣的指令,名称为 rename ,
# 该指令则专职进行档案的更名呢!用途也是不少~可以参阅 man rename 喔!
范例三:再建立两个档案,再全部移动到 /tmp/mvtest2 当中
[root@linux tmp]# cp ~/.bashrc bashrc1
[root@linux tmp]# cp ~/.bashrc bashrc2
[root@linux tmp]# mv bashrc1 bashrc2 mvtest2
# 注意到这边,如果有多个来源档案或目录,则最后一个目标文件一定是『目录!』
# 意思是说,将所有的数据移动到该目录的意思!



rm(移除档案或目录)

[root@linux ~]# rm [-fir] 档案或目录
参数:
-f :就是 force 的意思,强制移除;
-i :互动模式,在删除前会询问使用者是否动作
-r :递归删除啊!最常用在目录的删除了
范例:
范例一:建立一档案后予以删除
[root@linux ~]# cd /tmp
[root@linux tmp]# cp ~/.bashrc bashrc
[root@linux tmp]# rm -i bashrc
rm: remove regular file `bashrc'? y
# 如果加上 -i 的参数就会主动询问喔!那么如果不要询问呢?就加 -f 参数啊!
范例二:删除一个不为空的目录
[root@linux tmp]# mkdir test
[root@linux tmp]# cp ~/.bashrc test/ <== 将档案复制到此目录去,就不是空的目录了
[root@linux tmp]# rmdir test
rmdir: `test': Directory not empty <== 删不掉啊!因为这不是空的目录!
[root@linux tmp]# rm -rf test
范例三:删除一个带有 - 开头的档案
[root@linux tmp]# ls *aa*
-rw-r--r-- 1 root root 0 Aug 22 10:52 -aaa-
[root@linux tmp]# rm -aaarm: invalid option -- a
Try `rm --help' for more information. <== 因为 "-" 是参数嘛!
[root@linux tmp]# rm ./-aaa-

这是移除的指令( remove ),相当于 dos 下的 del 指令!这里要注意的是,通常在 Linux 系统下,为了
怕档案被误杀,所以很多 distributions 都已经预设有 -i 这个参数, -i 是指每个档案被杀掉之前都会
让使用者确认一次,以预防误杀档案!而如果要连目录下的东西都一起杀掉的话, 例如子目录里面还有子
目录时,那就要使用 -rf 这个参数了!不过,使用『 rm -rf 』这个指令之前,请千万注意了,因为,该
目录或档案『肯定』会被 root 杀掉!因为系统不会再次询问你是否要砍掉呦!所以那是个超级严重的指
令下达呦! 得特别注意!不过,如果你确定该目录不要了,那么使用 rm -rf 来循环杀掉是不错的方式!
另外,范例三也是很有趣的例子,我们在之前就谈过,档名最好不要使用 "-" 号开头, 因为 "-" 后面接
的是参数,因此,单纯的使用『 rm -aaa- 』系统的指令就会误判啦! 那如果使用后面会谈到的正规表示
法时,还是会出问题的!所以,只能用避过首位字符是 "-" 的方法啦! 就是加上本目录『 ./ 』即可!
如果 man rm 的话,其实还有一种方法,那就是『 rm -- -aaa- 』也可以啊!

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

basename

[root@linux ~]# basename /etc/sysconfig/networ
network <== 很简单!就取得最后的档名~
[root@linux ~]# dirname /etc/sysconfig/network
/etc/sysconfig <== 取得的变成目录名了!

dirname

档案内容查阅

• cat 由第一行开始显示档案内容

[root@linux ~]# cat [-AEnTv]
参数:
-A :相当于 -vET 的整合参数,可列出一些特殊字符~
-E :将结尾的断行字符 $ 显示出来;
-n :打印出行号;
-T :将 [tab] 按键以 ^I 显示出来;
-v :列出一些看不出来的特殊字符
范例:
范例一:检阅 /etc/issue 这个档案的内容
[root@linux ~]# cat /etc/issue
Fedora Core release 4 (Stentz)
Kernel \r on an \m
范例二:承上题,顺便打印出行号时!
[root@linux ~]# cat -n /etc/issue
1 Fedora Core release 4 (Stentz)
2 Kernel \r on an \m
3
# 看到了吧!可以印出行号呢!这对于大档案要找某个特定的行时,有点用处!


范例三:将 /etc/xinetd.conf 的内容完整的显示出来(包含特殊字符)
[root@linux ~]# cat -A /etc/xinetd.conf
#$
# Simple configuration file for xinetd$
#$
# Some defaults, and include /etc/xinetd.d/$
$
defaults$
{$
^Iinstances = 60$
log_type = SYSLOG authpriv$
log_on_success^I^I= HOST PID$
log_on_failure^I^I= HOST$
^Icps^I^I^I= 25 30$
}$
$
includedir /etc/xinetd.d$
# 在一般的环境中,打印出来的结果在有 [tab] 与空格键,其实看不出来,
# 那么使用 cat -A 时,会将 [tab] 按键以 ^I 显示,而断行字符也会显示出来~
# 最特殊的当然就是断行字符了!这个段行字符在 Linux 与 Windows 是不一样的。
# 在 Linux 是以 $ 为断行字符,而在 Windows 则是以 ^M$ 为断行字符。
# 这部分我们会在 vi 软件的介绍时,再次的说明到喔!

• tac 从最后一行开始显示,可以看出 tac 是 cat 的倒着写!

[root@linux ~]# tac /etc/issue
Kernel \r on an \m
Fedora Core release 4 (Stentz)
# 嘿嘿!与刚刚上面的范例一比较,是由最后一行先显示喔!

• nl 显示的时候,顺道输出行号!

[root@linux ~]# nl [-bnw] 档案
参数:
-b :指定行号指定的方式,主要有两种:
-b a :表示不论是否为空行,也同样列出行号;
-b t :如果有空行,空的那一行不要列出行号;
-n :列出行号表示的方法,主要有三种:
-n ln :行号在屏幕的最左方显示;
-n rn :行号在自己字段的最右方显示,且不加 0 ;
-n rz :行号在自己字段的最右方显示,且加 0 ;
-w :行号字段的占用的位数。
范例:
范例一:列出 /etc/issue 的内容
[root@linux ~]# nl /etc/issue
1 Fedora Core release 4 (Stentz)
2 Kernel \r on an \m
# 注意看,这个档案其实有三行,第三行为空白(没有任何字符),
# 因为他是空白行,所以 nl 不会加上行号喔!如果确定要加上行号,可以这样做:
[root@linux ~]# nl -b a /etc/issue
1 Fedora Core release 4 (Stentz)
2 Kernel \r on an \m
3
# 呵呵!行号加上来啰~那么如果要让行号前面自动补上 0 呢?可这样
[root@linux ~]# nl -b a -n rz /etc/issue
000001 Fedora Core release 4 (Stentz)
000002 Kernel \r on an \m
000003
# 嘿嘿!自动在自己字段的地方补上 0 了~预设字段是六位数,如果想要改成 3 位数?
[root@linux ~]# nl -b a -n rz -w 3 /etc/issue
001 Fedora Core release 4 (Stentz)
002 Kernel \r on an \m
003
# 变成仅有 3 位数啰


• more 一页一页的显示档案内容

[root@linux ~]# more /etc/man.config
#
# Generated automatically from man.conf.in by the
# configure script.
#
# man.conf from man-1.5p
#
.......中间省略.......
--More--(28%) <== 重点在这一行喔!

仔细的给他看到上面的范例,如果 more 后面接的档案长度大于屏幕输出的行数时, 就会出现类似上面的
图示。重点在最后一行,最后一行会显示出目前显示的百分比, 而且还可以在最后一行输入一些有用的指
令喔!在 more 这个程序的运作过程中,你有几个按键可以按的:
• 空格键 (space):代表向下翻一页;
• Enter :代表向下翻『一行』;
• /字符串 :代表在这个显示的内容当中,向下搜寻『字符串』;
• :f :立刻显示出文件名以及目前显示的行数;
• q :代表立刻离开 more ,不再显示该档案内容。


如同上面的说明,输入了 / 之后,光标就会跑到最底下一行,并且等待您的输入, 您输入了字符串之后,
嘿嘿! more 就会开始向下搜寻该字符串啰~而重复搜寻同一个字符串, 可以直接按下 n 即可啊!最后,
不想要看了,就按下 q 即可离开 more 啦!

• less 与 more 类似,但是比 more 更好的是,他可以往前翻页!

[root@linux ~]# less /etc/man.config
#
# Generated automatically from man.conf.in by the
# configure script.
#
# man.conf from man-1.5p
......中间省略........
: <== 这里可以等待您输入指令!


less 的用法比起 more 又更加的有弹性,怎么说呢?在 more 的时候,我们并没有办法向前面翻, 只能
往后面看,但若使用了 less 时,呵呵!就可以使用 [pageup] [pagedown] 等按键的功能来往前往后翻看
文件,您瞧,是不是更容易使用来观看一个档案的内容了呢!?
除此之外,在 less 里头可以拥有更多的『搜寻』功能喔!不止可以向下搜寻,也可以向上搜寻~ 实在是
很不错用~基本上,可以输入的指令有:
• 空格键 :向下翻动一页;
• [pagedown]:向下翻动一页;
• [pageup] :向上翻动一页;
• /字符串 :向下搜寻『字符串』的功能;
• ?字符串 :向上搜寻『字符串』的功能;
• n :重复前一个搜寻 (与 / 或 ? 有关! )
• N :反向的重复前一个搜寻 (与 / 或 ? 有关! )
• q :离开 less 这个程序;
查阅档案内容还可以进行搜寻的动作~瞧~ less 是否很不错用啊! 其实 less 还有很多的功能喔!详细
的使用方式请使用 man less 查询一下啊! ^

• head 只看头几行

[root@linux ~]# head [-n number] 档案
参数:
-n :后面接数字,代表显示几行的意思
范例:
[root@linux ~]# head /etc/man.config
# 预设的情况中,显示前面十行!若要显示前 20 行,就得要这样:
[root@linux ~]# head -n 20 /etc/man.config

[root@linux ~]# head [-n number] 档案
参数:
-n :后面接数字,代表显示几行的意思
范例:
[root@linux ~]# head /etc/man.config
# 预设的情况中,显示前面十行!若要显示前 20 行,就得要这样:
[root@linux ~]# head -n 20 /etc/man.config


• tail 只看尾巴几行

[root@linux ~]# tail [-n number] 档案
参数:
-n :后面接数字,代表显示几行的意思
范例:
[root@linux ~]# tail /etc/man.config
# 预设的情况中,显示最后的十行!若要显示最后的 20 行,就得要这样:
[root@linux ~]# tail -n 20 /etc/man.config


那么有 head 自然就有 tail ( 尾巴 ) 啰!没错!这个 tail 的用法跟 head 的用法差不多类似,只是显
示的是后面几行就是了!预设也是显示十行,若要显示非十行,就加 -n number 的参数!
例题一:假如我想要显示 ~/.bashrc 的第 11 到第 20 行呢?
答:
这个应该不算难,想一想,在第 11 到第 20 行,那么我取前 20 行,再取后十行,
所以结果就是:『 head –n 20 ~/.bashrc | tail –n 10 』,这样就可以得到第 11
到第 20 行之间的内容了!但是里面涉及到管线命令,需要在第三篇的时候才讲的到!

• od 以二进制的方式读取档案内容

[root@linux ~]# 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 byt
范例:
[root@linux ~]# od -t c /usr/bin/passwd
0000000 177 E L F 001 001 001 \0 \0 \0 \0 \0 \0 \0 \0 \0
0000020 002 \0 003 \0 001 \0 \0 \0 260 225 004 \b 4 \0 \0 \0

修改档案时间与建置新档: touch

我们在 ls 这个指令的介绍时,有稍微提到每个档案在 linux 底下都会记录三个主要的变动时间, 咦!
那么三个时间是哪三个呢?
• modification time (mtime):当该档案的『内容数据』变更时,就会更新这个时间! 内容数据
指的是档案的内容,而不是档案的属性喔!
• status time (ctime):当该档案的『状态 (status)』改变时,就会更新这个时间,举例来说, 像
是权限与属性被更改了,都会更新这个时间啊~
• access time (atime):当『该档案的内容被取用』时,就会更新这个读取时间 (access)。 举例
来说,我们使用 cat 去读取 ~/.bashrc ,就会更新 atime 了.

root@linux ~]# ls -l /etc/man.config
-rw-r--r-- 1 root root 4506 Apr 8 19:11 /etc/man.config
[root@linux ~]# ls -l --time=atime /etc/man.config
-rw-r--r-- 1 root root 4506 Jul 19 17:53 /etc/man.config
[root@linux ~]# ls -l --time=ctime /etc/man.config
-rw-r--r-- 1 root root 4506 Jun 25 08:28 /etc/man.config

看到了吗?在预设的情况下, ls 显示出来的是该档案的 mtime ,也就是这个档案的内容上次被更动的时
间。 至于我的系统是在 6/25 的时候安装的,因此,这个档案被产生但是状态被更动的时间就回溯到那个
时间点了! 而还记得刚刚我们使用的范例当中,有使用到这个档案啊,所以啊,他的 atime 就会变成刚
刚使用的时间了!
档案的时间是很重要的,因为,如果档案的时间误判的话,可能会造成某些程序无法顺利的运作~ OK!那
么万一我发现了一个档案来自未来(嘿嘿!不要怀疑!很多时候会有这个问题的!这个我们在安装的时候,
提到的 GMT 时间就是那个意思啦~),那该如何让该档案的时间变成『现在』的时刻呢? 很简单啊!就用
『touch』这个指令即可!

[root@linux ~]# touch [-acdmt] 档案
参数:
-a :仅修订 access time;
-c :仅修改时间,而不建立档案;-d :后面可以接日期,也可以使用 --date="日期或时间"
-m :仅修改 mtime ;
-t :后面可以接时间,格式为[YYMMDDhhmm]
范例:
范例一:新建一个空的档案
[root@linux ~]# cd /tmp
[root@linux tmp]# touch testtouch
[root@linux tmp]# ls -l testtouch
-rw-r--r-- 1 root root 0 Jul 19 20:49 testtouch
# 注意到,这个档案的大小是 0 呢!在预设的状态下,如果 touch 后面有接档案,
# 则该档案的三个时间 (atime/ctime/mtime) 都会更新为目前的时间。若该档案不存在,
# 则会主动的建立一个新的空的档案喔!例如上面这个例子!
范例二:将 ~/.bashrc 复制成为 bashrc,假设复制完全的属性,检查其日期
[root@linux tmp]# cp ~/.bashrc bashrc
[root@linux tmp]# ll bashrc; ll --time=atime bashrc; ll --time=ctime bashrc
-rwxr-xr-x 1 root root 395 Jul 4 11:45 bashrc <==这是 mtime
-rwxr-xr-x 1 root root 395 Jul 19 20:44 bashrc <==这是 atime
-rwxr-xr-x 1 root root 395 Jul 19 20:53 bashrc <==这是 ctime
# 在这个案例当中,我们使用了 ; 这个指令分隔符,他的用法我们会在 Bash shell 中提到。
# 此外, ll 是 ls -l 的命令别名,这个我们也会在 bash shell 当中再次提及,
# 您目前可以简单的想成, ll 就是 ls -l 的简写即可!至于 ; 则是同时下达两个指令,
# 且让两个指令『依序』执行的意思。上面的结果当中我们可以看到,该档案变更的日期
# Jul 4 11:45,但是 atime 与 ctime 不一样啰~
范例三:修改案例二的 bashrc 档案,将日期调整为两天前
[root@linux tmp]# touch -d "2 days ago" bashrc
[root@linux tmp]# ll bashrc; ll --time=atime bashrc; ll --time=ctime bashrc
-rwxr-xr-x 1 root root 395 Jul 17 21:02 bashrc
-rwxr-xr-x 1 root root 395 Jul 17 21:02 bashrc
-rwxr-xr-x 1 root root 395 Jul 19 21:02 bashrc
# 跟上个范例比较看看,本来是 19 日的变成了 17 日了 (atime/mtime)~
# 不过, ctime 并没有跟着改变喔!
范例四:将上个范例的 bashrc 日期改为 2005/07/15 2:02
[root@linux tmp]# touch -t 0507150202 bashrc
[root@linux tmp]# ll bashrc; ll --time=atime bashrc; ll --time=ctime bashrc
-rwxr-xr-x 1 root root 395 Jul 15 02:02 bashrc
-rwxr-xr-x 1 root root 395 Jul 15 02:02 bashrc
-rwxr-xr-x 1 root root 395 Jul 19 21:05 bashrc
# 注意看看,日期在 atime 与 mtime 都改变了,但是 ctime 则是记录目前的时间!


透过 touch 这个指令,我们可以轻易的修订档案的日期与时间。并且,也可以建立一个空的档案喔! 不
过,要注意的是,即使我们复制一个档案时,复制所有的属性,但也没有办法复制 ctime 这个属性的。 ctime
可以记录这个档案最近的状态 (status) 被改变的时间。无论如何,还是要告知大家, 我们平时看的档案
属性中,比较重要的还是属于那个 mtime 啊!我们关心的常常是这个档案的『内容』 是什么时候被更动
的说~瞭乎?
无论如何, touch 这个指令最常被使用的情况是:
• 建立一个空的档案;
• 将某个档案日期修订为目前 (mtime 与 atime)


档案与目录的预设权限与隐藏权限







 
















  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值