说明在 Linux 底下处理文件与目录的相关指令啊~^_^
本文数据主要针对 Fedora Core 4 的系统进行说明, Fedora Core 1 主要是由 Red Hat Linux 9 改版而来, 这个 Red Hat Linux 9 并不是当前大家听到的 RHEL 喔!那是在 RHEL 出现之前的产品,基本上是在 2003 年以前的作品了!Fedora Core 4 则是在 2005 年 6 月份发布,使用的内核是 2.6.11 版,当时是很红的一个作品!只是生命周期太短,所以用这个 Fedora 系列来介绍 Server, 当时的决定确实有点莫名其妙了...
建议您前往本站查找最新版本的 Linux distribution 文章来阅读,比较不会浪费时间。那为何还需要编辑 Fedora Core 4 的数据呢? 鸟哥只想要做个自己曾经撰写过的文档内容保存而已啰! ^_^!最新文章请前往鸟站首页查阅啰!
在前一章节里面我们认识了 Linux 系统下的文件权限概念以及目录的配置说明。 在这个章节当中,我们就直接来进一步的操作与管理文件与目录吧!包括在不同的目录间变换、 创建与删除目录、创建与删除文件,还有寻找文件、查阅文件内容等等, 都会在这个章节作个简单的介绍啊!
. 代表此层目录
.. 代表上一层目录
- 代表前一个工作目录
~ 代表『目前用户身份』所在的家目录
~account 代表 account 这个用户的家目录
而在目录底下有两个目录是一定会存在的!那就是 . 与 .. 啰~
分别代表此层与上层目录的意思。那我们在前一章 Linux 文件属性与目录配置
里面也知道根目录 (/) 是所有目录的最顶层,那么 / 有 .. 吗?!您可以使用 ls -al / 去看看,
答案是『有的!』不过,您也可以查阅到,根目录的 . 与 .. 属性完全一模一样,哈哈!
原来根目录的顶层 (..) 与他自己 (.) 是同一个目录啦! ^_^[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 就这样写!cd 是 Change Directory 的缩写,这是用来变换工作目录的指令。注意,目录名称与 cd 指令之间存在一个空格。 一登录 Linux 系统后,root 会在 root 的家目录,亦即 /root 下,OK!那回到上一层目录可以用『 cd .. 』。 利用相对路径的写法必须要确认您目前的路径才能正确的去到想要去的目录。例如上表当中最后一个例子, 您必须要确认您是在 /var/spool/mail 当中,并且知道在 /var/spool 当中有个 mqueue 的目录才行啊~ 这样才能使用 cd ../mqueue 去到正确的目录说,否则就要直接输入 cd /var/spool/mqueue 啰~
[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 的参数后,会不以链接档的数据显示,而是显示正确的完整路径啊!pwd 是 Print Working Directory 的缩写,也就是显示目前所在目录的指令, 例如在上个表格最后的目录是 /var/mail 这个目录,但是提示字符仅显示 mail, 如果你想要知道目前所在的目录,可以输入 pwd 即可。此外,由于很多的套件所使用的目录名称都相同,例如 /usr/local/etc 还有 /etc ,但是通常 Linux 仅列出最后面那一个目录而已,这个时候你就可以使用 pwd 来知道你的所在目录啰!免得搞错目录,结果……
[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 drwxr-xr-x 3 root root 4096 Jul 18 12:53 test1 drwx--x--x 2 root root 4096 Jul 18 12:54 test2 # 仔细看上面的权限部分,如果没有加上 -m 来强制设置属性,系统会使用缺省属性。 # 那么您的缺省属性为何?这要通过底下介绍的 umask 才能了解喔! ^_^如果想要创建新的目录的话,那么就使用 mkdir (make directory) 吧! 不过,请注意呦!在缺省的情况下, 你所需要的目录得一层一层的创建才行!例如:假如你要创建一个目录为 /home/bird/testing/test1,那么首先必须要有 /home 然后 /home/bird ,再来 /home/bird/testing 都必须要存在,才可以创建 /home/bird/testing/test1 这个目录!假如没有 /home/bird/testing 时,就没有办法创建 test1 的目录啰!不过,现在有个更简单有效的方法啦!那就是加上 -p 这个参数喔!你可以直接下达:『 mkdir -p /home/bird/testing/test1 』 则系统会自动的帮你将 /home, /home/bird, /home/bird/testing 依序的创建起目录!并且, 如果该目录本来就已经存在时,系统也不会显示错误消息喔!挺快乐的吧! ^_^
[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 仅能『删除空的目录』喔!如果想要创建删除旧有的目录时,就使用 rmdir 吧!例如将刚刚创建的 test 杀掉,使用 rmdir test 即可!请注意呦!目录需要一层一层的删除才行!而且 被删除的目录里面必定不能还有其他的目录或文件! 这也是所谓的空的目录 (empty directory) 的意思啊!那如果要将所有目录下的东西都杀掉呢?! 这个时候就必须使用 rm -rf test 啰!不过,还是使用 rmdir 比较不危险!不过,你也可以尝试以 -p 的参数加入,来删除上层的目录喔!
[root@linux ~]# echo $PATH
/sbin:/usr/sbin:/bin:/usr/bin:/usr/X11R6/bin:/usr/local/bin:/usr/local/sbin
注意到了吗?对啦! /bin 在 PATH 的设置之中,所以自然就可以找的到 ls 啦!
PATH 对于运行档来说,是个很重要的『变量』,他主要是用来规范指令搜索的目录。
而每个目录是有顺序的,每个目录中间以冒号『:』来分隔,就如同上面范例中提到的啰!
那么 PATH 这个变量还有什么地方重要呢?
[root@linux ~]# PATH="$PATH":/root
这种方式来增加 PATH 搜索目录即可!另一种方式则是使用完整文件名来下达指令,
亦即直接使用相对或绝对路径来运行,例如:[root@linux ~]# /root/ls [root@linux ~]# ./ls因为在同一个目录中,而我们又知道在同一个目录中的目录符号为『 . 』,因此,就以上面的 ./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) 范例:在 Linux 系统当中,这个 ls 指令可能是最常被运行的吧!因为我们随时都要知道文件或者是目录的相关信息啊~ 不过,我们 Linux 的文件所记录的信息实在是太多了, ls 没有需要全部都列出来呢~ 所以,当您只有下达 ls 时,缺省显示的只有:非隐藏档的文件名、 以文件名进行排序及文件名代表的颜色显示;如此而已。举例来说, 您下达 ls /etc 之后,只有经过排序的文件名以及以蓝色显示目录及白色显示一般文件,如此而已。
范例一:将家目录下的所有文件列出来(含属性与隐藏档) [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 可以查阅到比较正确的完整时间格式啊!其实 ls 的用法还有很多,包括查阅文件所在 i-node 的 ls -i 参数,以及用来进行文件排序的 -S 参数,还有用来查阅不同时间的动作的 --time=atime 等参数。而这些参数的存在都是因为 Linux 文件系统记录了很多有用的信息的缘故。那么 Linux 的文件系统中,这些与权限、属性有关的数据放在哪里呢? 放在 i-node 里面。关于这部分,我们会在下个章节继续跟您作比较深入的介绍啊!
[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 # 可以将多个数据一次拷贝到同一个目录去!这个 cp 的功能很多,而由于我们常常在进行一些数据的拷贝,所以也会常常用到这个指令的。 一般来说,我们如果去拷贝别人的数据 (当然,该文件您必须要有 read 的权限才行啊! ^_^) 时, 总是希望拷贝到的数据最后是我们自己的,所以,在缺省的条件中, cp 的来源档与目的档的权限是不同的,目的档的拥有者通常会是指令操作者本身。举例来说, 上面的范例二中,由于我是 root 的身份,因此拷贝过来的文件拥有者与群组就改变成为 root 所有了! 这样说,可以明白吗?! ^_^
[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 -aaa- rm: 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 来循环杀掉是不错的方式!
[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 # 注意到这边,如果有多个来源文件或目录,则最后一个目标档一定是『目录!』 # 意思是说,将所有的数据移动到该目录的意思!这是搬移 (move) 的意思!当你要移动文件或目录的时后,呵呵!这个指令就很重要啦! 同样的,你也可以使用 -u ( update )来测试新旧文件,看看是否需要搬移啰! 另外一个用途就是『变更文件名!』,我们可以很轻易的使用 mv 来变更一个文件的文件名呢!不过,在 Linux 才有的指令当中,有个 rename , 可以用来更改大量文件的文件名,您可以利用 man rename 来查阅一下,也是挺有趣的指令喔!
[root@linux ~]# basename /etc/sysconfig/network network <== 很简单!就取得最后的文件名~ [root@linux ~]# dirname /etc/sysconfig/network /etc/sysconfig <== 取得的变成目录名了!很简单的应用吧!
[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 软件的介绍时,再次的说明到喔!嘿嘿! Linux 里面有『猫』?!喔!不是的, cat 是 Concatenate (连续)的简写, 主要的功能是将一个文件的内容连续的印出在屏幕上面!例如上面的例子中,我们将 /etc/issue 印出来!如果加上 -n 的话,则每一行前面还会加上行号呦!鸟哥个人是比较少用 cat 啦!毕竟当你的文件内容的行数超过 40 行以上,嘿嘿!根本来不及看!所以,配合等一下要介绍的 more 或者是 less 来运行比较好!此外,如果是一般的 DOS 文件时,就需要特别留意一些奇奇怪怪的符号了, 例如断行与 [tab] 等,要显示出来,就得加入 -A 之类的参数了!
[root@linux ~]# tac /etc/issue Kernel \r on an \m Fedora Core release 4 (Stentz) # 嘿嘿!与刚刚上面的范例一比较,是由最后一行先显示喔!tac 这个好玩了!怎么说呢?详细的看一下, cat 与 tac ,有没有发现呀!对啦! tac 刚好是将 cat 反写过来,所以他的功能就跟 cat 相反啦, cat 是由『第一行到最后一行连续显示在屏幕上』,而 tac 则是『 由最后一行到第一行反向在屏幕上显示出来 』,很好玩吧!
[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 位数啰~nl 可以将输出的文件内容自动的加上行号!其结果与 cat -n 有点不太一样, nl 可以将行号做比较多的显示设计,包括位数与是否自动补齐 0 等等的功能呢~
[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 这个程序的运作过程中,你有几个按键可以按的:
[root@linux ~]# more /etc/man.config # # Generated automatically from man.conf.in by the # configure script. # # man.conf from man-1.5p # .......中间省略....... /MANPATH <== 输入了 / 之后,光标就会自动跑到最底下一行等待输入!如同上面的说明,输入了 / 之后,光标就会跑到最底下一行,并且等待您的输入, 您输入了字符串之后,嘿嘿! more 就会开始向下搜索该字符串啰~而重复搜索同一个字符串, 可以直接按下 n 即可啊!最后,不想要看了,就按下 q 即可离开 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] 等按键的功能来往前往后翻看文档,您瞧,是不是更容易使用来观看一个文件的内容了呢!?
[root@linux ~]# head [-n number] 文件 参数: -n :后面接数字,代表显示几行的意思 范例: [root@linux ~]# head /etc/man.config # 缺省的情况中,显示前面十行!若要显示前 20 行,就得要这样: [root@linux ~]# head -n 20 /etc/man.confighead 的英文意思就是『头』啦,那么这个东西的用法自然就是显示出一个文件的前几行啰! 没错!就是这样!若没有加上 -n 这个参数时,缺省只显示十行,若只要一行呢?那就加入『 head -n 1 filename 』即可!
[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 行呢? 答:
|
[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 bytes ; 范例: [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 0000040 020 E \0 \0 \0 \0 \0 \0 4 \0 \0 \a \0 ( \0 0000060 035 \0 034 \0 006 \0 \0 \0 4 \0 \0 \0 4 200 004 \b 0000100 4 200 004 \b 340 \0 \0 \0 340 \0 \0 \0 005 \0 \0 \0 .....中间省略.......利用这个指令,可以将 data file 或者是 binary file 的内容数据给他读出来喔! 虽然读出的来数值缺省是使用非文本档,亦即是 16 进位的数值来显示的, 不过,我们还是可以通过 -t c 的参数来将数据内的字符以 ASCII 类型的字符来显示, 虽然对于一般用户来说,这个指令的用处可能不大,但是对于工程师来说, 这个指令可以将 binary file 的内容作一个大致的输出,他们可以看得出东西的啦~ ^_^
[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 就会变成刚刚使用的时间了!
[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 啊!我们关心的常常是这个文件的『内容』 是什么时候被更动的说~瞭乎?
例题二:你的系统有个一般身份用户 dmtsai,他的群组为 users,他的家目录在 /home/dmtsai,
你想将你的 ~/.bashrc 拷贝给他(假设你是 root),可以怎么作? 答:
chown dmtsai:users ~dmtsai/bashrc |
例题三:我想在 /tmp 底下创建一个目录,这个目录名称为 chap2_2_ex1 ,并且,这个目录拥有者为 dmtsai,
群组为 users ,此外,任何人都可以进入该目录浏览文件,不过除了 dmtsai 之外,其他人都不能修改该目录下的文件。 答:
mkdir /tmp/chap2_2_ex1 chown -R dmtsai:users /tmp/chap2_2_ex1 chmod -R 755 /tmp/chap2_2_ex1 |
[root@linux ~]# umask 0022 [root@linux ~]# umask -S u=rwx,g=rx,o=rx查阅的方式有两种,一种可以直接输入 umask ,就可以看到数字型态的权限设置分数, 一种则是加入 -S (Symbolic) 这个参数,就会以符号类型的方式来显示出权限了! 奇怪的是,怎么 umask 会有四组数字啊?不是只有三组吗?是没错啦~ 第一组是特殊权限用的,我们先不要理他,所以先看后面三组即可。
[root@linux ~]# umask 0022 [root@linux ~]# touch test1 [root@linux ~]# mkdir test2 [root@linux ~]# ll -rw-r--r-- 1 root root 0 Jul 20 00:36 test1 drwxr-xr-x 2 root root 4096 Jul 20 00:36 test2呵呵!瞧见了吧?!确定属性是没有错的。好了,假如我们想要让与用户同群组的人也可以访问文件呢? 也就是说,假如 dmtsai 是 users 这个群组的人,而 dmtsai 作的文件希望让 users 同群组的人也可以访问, 这也是常常被用在团队开发计划时,常常会考虑到的权限问题。在这样的情况下, 我们的 umask 自然不能取消 group 的 w 权限,也就是说,我们希望制作出来的文件应该是 -rw-rw-r-- 的模样,所以啰, umask 应该是要 002 才好 (仅拿掉 others 的 w 权限)。那么如何设置 umask 呢? 简单的很,直接在 umask 后面输入 002 就好了!
[root@linux ~]# umask 002 [root@linux ~]# touch test3 [root@linux ~]# mkdir test4 [root@linux ~]# ll -rw-rw-r-- 1 root root 0 Jul 20 00:41 test3 drwxrwxr-x 2 root root 4096 Jul 20 00:41 test4所以说,这个 umask 对于文件与目录的缺省权限是很有关系的!这个概念可以用在任何服务器上面, 尤其是未来在您架设文件服务器 (file server) ,举例来说, SAMBA Server 或者是 FTP server 时, 都是很重要的观念!这牵涉到您的用户是否能够将文件进一步利用的问题喔!不要等闲视之!
例题四:假设您的 umask 为 003 ,请问该 umask 情况下,创建的文件与目录权限为? 答:
文件: (-rw-rw-rw-) - (--------wx) = -rw-rw-r-- 目录: (drwxrwxrwx) - (--------wx) = drwxrwxr-- |
[root@linux ~]# chattr [+-=][ASacdistu] 文件或目录名称 参数: + :增加某一个特殊参数,其他原本存在参数则不动。 - :移除某一个特殊参数,其他原本存在参数则不动。 = :设置一定,且仅有后面接的参数 A :当设置了 A 这个属性时,这个文件(或目录)的访问时间 atime (access) 将不可被修改,可避免例如手提式电脑容易有磁盘 I/O 错误的情况发生! S :这个功能有点类似 sync 的功能!就是会将数据同步写入磁盘当中! 可以有效的避免数据流失! a :当设置 a 之后,这个文件将只能增加数据,而不能删除,只有 root 才能设置这个属性。 c :这个属性设置之后,将会自动的将此文件『压缩』,在读取的时候将会自动解压缩, 但是在保存的时候,将会先进行压缩后再保存(看来对于大文件似乎蛮有用的!) d :当dump(备份)进程被运行的时候,设置 d 属性将可使该文件(或目录)不具有dump功能 i :这个 i 可就很厉害了!他可以让一个文件『不能被删除、改名、设置链接也无法写入 或添加数据!』对于系统安全性有相当大的助益! j :当使用 ext3 这个文件系统格式时,设置 j 属性将会使文件在写入时先记录在 journal 中!但是当 filesystem 设置参数为 data=journalled 时,由于已经设置了 日志了,所以这个属性无效! s :当文件设置了 s 参数时,他将会被完全的移除出这个硬盘空间。 u :与 s 相反的,当使用 u 来设置文件时,则数据内容其实还存在磁盘中, 可以使用来 undeletion. 注意:这个属性设置上面,比较常见的是 a 与 i 的设置值,而且很多设置值必须要身为 root 才能够设置的喔! 范例: [root@linux ~]# cd /tmp [root@linux tmp]# touch attrtest [root@linux tmp]# chattr +i attrtest [root@linux tmp]# rm attrtest rm: remove write-protected regular empty file `attrtest'? y rm: cannot remove `attrtest': Operation not permitted # 看到了吗?呼呼!连 root 也没有办法将这个文件删除呢!赶紧解除设置! [root@linux tmp]# chattr -i attrtest这这个指令是重要的,尤其是在系统的安全性上面!由于这些属性是隐藏的性质,所以需要以 lsattr 才能看到该属性呦!其中,个人认为最重要的当属 +i 这个属性了,因为他可以让一个文件无法被更动,对于需要强烈的系统安全的人来说, 真是相当的重要的!里头还有相当多的属性是需要 root 才能设置的呢!此外,如果是 log file 这种的注册表,就更需要 +a 这个可以增加,但是不能修改旧有的数据与删除的参数了! 怎样?很棒吧!未来提到注册表的认知时,我们再来聊一聊如何设置他吧!
[root@linux ~]# lsattr [-aR] 文件或目录 参数: -a :将隐藏档的属性也秀出来; -R :连同子目录的数据也一并列出来! 范例: [root@linux tmp]# chattr +aij attrtest [root@linux tmp]# lsattr ----ia---j--- ./attrtest使用 chattr 设置后,可以利用 lsattr 来查阅隐藏的属性。不过, 这两个指令在使用上必须要特别小心,否则会造成很大的困扰。例如:某天你心情好,突然将 /etc/shadow 这个重要的密码记录文件给他设置成为具有 i 的属性,那么过了若干天之后, 你突然要添加用户,却一直无法添加!别怀疑,赶快去将 i 的属性拿掉吧!
[root@linux ~]# ls -ld /tmp ; ls -l /usr/bin/passwd drwxrwxrwt 5 root root 4096 Jul 20 10:00 /tmp -r-s--x--x 1 root root 18840 Mar 7 18:06 /usr/bin/passwd不是只有 rwx 吗?还有其他的特殊权限啊?啊.....头又开始昏了~ @_@ 呵呵,不要担心啦,我们这里先不谈这两个权限,只是先介绍一下而已。 因为要了解这几个特殊的权限,必须要先具有帐号的 ID 概念,以及程序的进程 (process) 概念后, 才能够进一步的了解这个特殊权限所代表的意义。
[root@linux ~]# cd /tmp [root@linux tmp]# touch test [root@linux tmp]# chmod 4755 test; ls -l test -rwsr-xr-x 1 root root 0 Jul 20 11:27 test [root@linux tmp]# chmod 6755 test; ls -l test -rwsr-sr-x 1 root root 0 Jul 20 11:27 test [root@linux tmp]# chmod 1755 test; ls -l test -rwxr-xr-t 1 root root 0 Jul 20 11:27 test [root@linux tmp]# chmod 7666 test; ls -l test -rwSrwSrwT 1 root root 0 Jul 20 11:27 test # 这个例子就要特别小心啦!怎么会出现大写的 S 与 T 呢?不都是小写的吗? # 因为 s 与 t 都是取代 x 这个参数的,但是你有没有发现阿,我们是下达 # 7666 喔!也就是说, user, group 以及 others 都没有 x 这个可运行的标志 # ( 因为 666 嘛! ),所以,这个 S, T 代表的就是『空的』啦!怎么说? # SUID 是表示『该文件在运行的时候,具有文件拥有者的权限』,但是文件 # 拥有者都无法运行了,哪里来的权限给其他人使用?当然就是空的啦! ^_^
[root@linux ~]# file ~/.bashrc /root/.bashrc: ASCII text <== 告诉我们是 ASCII 的纯文本档啊! [root@linux ~]# file /usr/bin/passwd /usr/bin/passwd: setuid ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), for GNU/Linux 2.2.5, dynamically linked (uses shared libs), stripped # 数据可多了~包括这个日 Set UID 2的文件,使用 shared libs, # 适合于 Intel 的 386 以上机种的硬件,很清楚吧! [root@linux ~]# file /var/lib/slocate/slocate.db /var/lib/slocate/slocate.db: data <== 这是 data 文件!通过这个指令,我们可以简单的先判断这个文件的格式为何喔!
[root@linux ~]# which [-a] command 参数: -a :将所有可以找到的指令均列出,而不止第一个被找到的指令名称 范例: [root@linux ~]# which passwd /usr/bin/passwd [root@linux ~]# which traceroute -a /usr/sbin/traceroute /bin/traceroute这个指令是根据『PATH』这个环境变量所规范的路径,去搜索『运行档』的文件名~ 所以,重点是找出『运行档』而已!且 which 后面接的是『完整文件名』喔!若加上 -a 参数,则可以列出所有的可以找到的同名运行档,而非仅显示第一个而已!
[root@linux ~]# whereis [-bmsu] 文件或目录名 参数: -b :只找 binary 的文件 -m :只找在说明档 manual 路径下的文件 -s :只找 source 来源文件 -u :没有说明档的文件! 范例: [root@linux ~]# whereis passwd passwd: /usr/bin/passwd /etc/passwd /etc/passwd.OLD /usr/share/man/man1/passwd.1.gz /usr/share/man/man5/passwd.5.gz # 任何与 passwd 有关的文件名都会被列出来~ [root@linux ~]# whereis -b passwd passwd: /usr/bin/passwd /etc/passwd /etc/passwd.OLD [root@linux ~]# whereis -m passwd passwd: /usr/share/man/man1/passwd.1.gz /usr/share/man/man5/passwd.5.gz等一下我们会提到 find 这个搜索指令, find 是很强大的搜索指令,但时间花用的很大! (因为 find 是直接搜索硬盘,为如果你的硬盘比较老旧的话,嘿嘿!有的等的!) 这个时候 whereis 就相当的好用了!另外, whereis 可以加入参数来找寻相关的数据, 例如如果你是要找可运行档 ( binary ) 那么加上 -b 就可以啦!例如上面的范例针对 passwd 这支程序来说明!如果不加任何参数的话,那么就将所有的数据列出来啰!
[root@linux ~]# locate filename [root@linux ~]# locate passwd /lib/security/pam_passwdqc.so /lib/security/pam_unix_passwd.so /usr/lib/kde3/kded_kpasswdserver.so /usr/lib/kde3/kded_kpasswdserver.la .......中间省略.......这个 locate 的使用更简单,直接在后面输入『文件的部分名称』后,就能够得到结果。 举上面的例子来说,我输入 locate passwd ,那么在完整文件名 (包含路径名称) 当中,只要有 passwd 在其中, 就会被显示出来的!这也是个很方便好用的指令,如果您忘记某个文件的完整文件名时~~
[root@linux ~]# find [PATH] [option] [action] 参数: 1. 与时间有关的参数: -atime n :n 为数字,意义为在 n 天之前的『一天之内』被 access 过的文件; -ctime n :n 为数字,意义为在 n 天之前的『一天之内』被 change 过状态的文件; -mtime n :n 为数字,意义为在 n 天之前的『一天之内』被 modification 过的文件; -newer file :file 为一个存在的文件,意思是说,只要文件比 file 还要新, 就会被列出来~ 2. 与用户或群组名称有关的参数: -uid n :n 为数字,这个数字是用户的帐号 ID,亦即 UID ,这个 UID 是记录在 /etc/passwd 里面与帐号名称对应的数字。这方面我们会在第四篇介绍。 -gid n :n 为数字,这个数字是群组名称的 ID,亦即 GID,这个 GID 记录在 /etc/group,相关的介绍我们会第四篇说明~ -user name :name 为用户帐号名称喔!例如 dmtsai -group name:name 为群组名称喔,例如 users ; -nouser :寻找文件的拥有者不存在 /etc/passwd 的人! -nogroup :寻找文件的拥有群组不存在于 /etc/group 的文件! 当您自行安装软件时,很可能该软件的属性当中并没有文件拥有者, 这是可能的!在这个时候,就可以使用 -nouser 与 -nogroup 搜索。 3. 与文件权限及名称有关的参数: -name filename:搜索文件名称为 filename 的文件; -size [+-]SIZE:搜索比 SIZE 还要大(+)或小(-)的文件。这个 SIZE 的规格有: c: 代表 byte, k: 代表 1024bytes。所以,要找比 50KB 还要大的文件,就是『 -size +50k 』 -type TYPE :搜索文件的类型为 TYPE 的,类型主要有:一般正规文件 (f), 设备文件 (b, c), 目录 (d), 链接档 (l), socket (s), 及 FIFO (p) 等属性。 -perm mode :搜索文件属性『刚好等于』 mode 的文件,这个 mode 为类似 chmod 的属性值,举例来说, -rwsr-xr-x 的属性为 4755 ! -perm -mode :搜索文件属性『必须要全部囊括 mode 的属性』的文件,举例来说, 我们要搜索 -rwxr--r-- ,亦即 0744 的文件,使用 -perm -0744, 当一个文件的属性为 -rwsr-xr-x ,亦即 4755 时,也会被列出来, 因为 -rwsr-xr-x 的属性已经囊括了 -rwxr--r-- 的属性了。 -perm +mode :搜索文件属性『包含任一 mode 的属性』的文件,举例来说,我们搜索 -rwxr-xr-x ,亦即 -perm +755 时,但一个文件属性为 -rw------- 也会被列出来,因为他有 -rw.... 的属性存在! 4. 额外可进行的动作: -exec command :command 为其他指令,-exec 后面可再接额外的指令来处理搜索到 的结果。 -print :将结果打印到屏幕上,这个动作是缺省动作! 范例: 范例一:将过去系统上面 24 小时内有更动过内容 (mtime) 的文件列出 [root@linux ~]# find / -mtime 0 # 那个 0 是重点!0 代表目前的时间,所以,从现在开始到 24 小时前, # 有变动过内容的文件都会被列出来!那如果是三天前的 24 小时内? # find / -mtime 3 ,意思是说今天之前的 3*24 ~ 4*24 小时之间 # 有变动过的文件都被列出的意思!同时 -atime 与 -ctime 的用法相同。 范例二:寻找 /etc 底下的文件,如果文件日期比 /etc/passwd 新就列出 [root@linux ~]# find /etc -newer /etc/passwd # -newer 用在分辨两个文件之间的新旧关系是很有用的! 范例三:搜索 /home 底下属于 dmtsai 的文件 [root@linux ~]# find /home -user dmtsai # 这个东西也很有用的~当我们要找出任何一个用户在系统当中的所有文件时, # 就可以利用这个指令将属于某个用户的所有文件都找出来喔! 范例四:搜索系统中不属于任何人的文件 [root@linux ~]# find / -nouser # 通过这个指令,可以轻易的就找出那些不太正常的文件。 # 如果有找到不属于系统任何人的文件时,不要太紧张, # 那有时候是正常的~尤其是您曾经以原代码自行编译软件时。 范例五:找出文件名为 passwd 这个文件 [root@linux ~]# find / -name passwd # 利用这个 -name 可以搜索文件名啊! 范例六:搜索文件属性为 f (一般文件) 的文件 [root@linux ~]# find /home -type f # 这个 -type 的属性也很有帮助喔!尤其是要找出那些怪异的文件, # 例如 socket 与 FIFO 文件,可以用 find /var -type p 或 -type s 来找! 范例七:搜索文件当中含有 SGID/SUID/SBIT 的属性 [root@linux ~]# find / -perm +7000 # 所谓的 7000 就是 ---s--s--t ,那么只要含有 s 或 t 的就列出, # 所以当然要使用 +7000 ,使用 -7000 表示要含有 ---s--s--t 的所有三个权限, # 因此,就是 +7000 ~瞭乎? 范例八:将上个范例找到的文件使用 ls -l 列出来~ [root@linux ~]# find / -perm +7000 -exec ls -l {} \; # 注意到,那个 -exec 后面的 ls -l 就是额外的指令, # 而那个 {} 代表的是『由 find 找到的内容』的意思~所以, -exec ls -l {} # 就是将前面找到的那些文件以 ls -l 列出长的数据!至于 \; 则是表示 # -exec 的指令到此为止的意思~意思是说,整个指令其实只有在 # -exec (里面就是指令下达) \; # 也就是说,-exec 最后一定要以 \; 结束才行!这样了解了吗?! 范例九:找出系统中,大于 1MB 的文件 [root@linux ~]# find / -size +1000k # 虽然在 man page 提到可以使用 M 与 G 分别代表 MB 与 GB, # 不过,俺却试不出来这个功能~所以,目前应该是仅支持到 c 与 k 吧!如果你要寻找一个文件的话,那么使用 find 会是一个不错的主意! 他可以根据不同的参数来给予文件的搜索功能!例如你要寻找一个文件名为 httpd.conf 的文件,你知道他应该是在 /etc 底下,那么就可以使用『 find /etc -name httpd.conf 』噜! 那如果你记得有一个文件文件名包含了 httpd ,但是不知道全名怎办?!呵呵,就用通配符 * 吧,如上以:『 find /etc -name '*httpd*' 』就可将文件名含有 httpd 的文件都列出来啰!不过,由于 find 在寻找数据的时后相当的耗硬盘!所以没事情不要使用 find 啦!有更棒的指令可以取代呦!那就是 whereis 与 locate 啰!!