Linux 文件与目录管理常用shell
nl -b a waiting.py // 显示文件行号
[root@www ~]# nl [-bnw] 文件 选项与参数: -b :指定行号指定的方式,主要有两种: -b a :表示不论是否为空行,也同样列出行号(类似 cat -n); -b t :如果有空行,空的那一行不要列出行号(默认值); -n :列出行号表示的方法,主要有三种: -n ln :行号在萤幕的最左方显示; -n rn :行号在自己栏位的最右方显示,且不加 0 ; -n rz :行号在自己栏位的最右方显示,且加 0 ; -w :行号栏位的占用的位数。 范例一:用 nl 列出 /etc/issue 的内容 [root@www ~]# nl /etc/issue 1 CentOS release 5.3 (Final) 2 Kernel \r on an \m # 注意看,这个文件其实有三行,第三行为空白(没有任何字节), # 因为他是空白行,所以 nl 不会加上行号喔!如果确定要加上行号,可以这样做: [root@www ~]# nl -b a /etc/issue 1 CentOS release 5.3 (Final) 2 Kernel \r on an \m 3 # 呵呵!行号加上来罗~那么如果要让行号前面自动补上 0 呢?可这样 [root@www ~]# nl -b a -n rz /etc/issue 000001 CentOS release 5.3 (Final) 000002 Kernel \r on an \m 000003 # 嘿嘿!自动在自己栏位的地方补上 0 了~默认栏位是六位数,如果想要改成 3 位数? [root@www ~]# nl -b a -n rz -w 3 /etc/issue 001 CentOS release 5.3 (Final) 002 Kernel \r on an \m 003 # 变成仅有 3 位数罗~
数据撷取
我们可以将输出的数据作一个最简单的撷取,那就是取出前面 (head) 与取出后面 (tail) 文字的功能。 不过,要注意的是, head 与 tail 都是以『行』为单位来进行数据撷取的喔!
- head (取出前面几行)
[root@www ~]# head [-n number] 文件 选项与参数: -n :后面接数字,代表显示几行的意思 [root@www ~]# head /etc/man.config # 默认的情况中,显示前面十行!若要显示前 20 行,就得要这样: [root@www ~]# head -n 20 /etc/man.config 范例:如果后面100行的数据都不列印,只列印/etc/man.config的前面几行,该如何是好? [root@www ~]# head -n -100 /etc/man.config |
head 的英文意思就是『头』啦,那么这个东西的用法自然就是显示出一个文件的前几行罗! 没错!就是这样!若没有加上 -n 这个选项时,默认只显示十行,若只要一行呢?那就加入『 head -n 1 filename 』即可!
另外那个 -n 选项后面的参数较有趣,如果接的是负数,例如上面范例的-n -100时,代表列前的所有行数, 但不包括后面100行。举例来说,/etc/man.config共有141行,则上述的命令『head -n -100 /etc/man.config』 就会列出前面41行,后面100行不会列印出来了。这样说,比较容易懂了吧? ^_^
- tail (取出后面几行)
[root@www ~]# tail [-n number] 文件 选项与参数: -n :后面接数字,代表显示几行的意思 -f :表示持续侦测后面所接的档名,要等到按下[ctrl]-c才会结束tail的侦测 [root@www ~]# tail /etc/man.config # 默认的情况中,显示最后的十行!若要显示最后的 20 行,就得要这样: [root@www ~]# tail -n 20 /etc/man.config 范例一:如果不知道/etc/man.config有几行,却只想列出100行以后的数据时? [root@www ~]# tail -n +100 /etc/man.config 范例二:持续侦测/var/log/messages的内容 [root@www ~]# tail -f /var/log/messages <==要等到输入[crtl]-c之后才会离开tail这个命令的侦测! |
有 head 自然就有 tail ( 尾巴 ) 罗!没错!这个 tail 的用法跟 head 的用法差不多类似,只是显示的是后面几行就是了!默认也是显示十行,若要显示非十行,就加 -n number 的选项即可。
范例一的内容就有趣啦!其实与head -n -xx有异曲同工之妙。当下达『tail -n +100 /etc/man.config』 代表该文件从100行以后都会被列出来,同样的,在man.config共有141行,因此第100~141行就会被列出来啦! 前面的99行都不会被显示出来喔!
至於范例二中,由於/var/log/messages随时会有数据写入,你想要让该文件有数据写入时就立刻显示到萤幕上, 就利用 -f 这个选项,他可以一直侦测/var/log/messages这个文件,新加入的数据都会被显示到萤幕上。 直到你按下[crtl]-c才会离开tail的侦测喔!
例题:
答:
我们上面提到的,都是在查阅纯文字档的内容。 那么万一我们想要查阅非文字档,举例来说,例如 /usr/bin/passwd 这个运行档的内容时, 又该如何去读出资讯呢?事实上,由於运行档通常是 binary file ,使用上头提到的命令来读取他的内容时, 确实会产生类似乱码的数据啊!那怎么办?没关系,我们可以利用 od 这个命令来读取喔!
[root@www ~]# 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@www ~]# 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 .....(后面省略).... # 最左边第一栏是以 8 进位来表示bytes数。以上面范例来说,第二栏0000020代表开头是 # 第 16 个 byes (2x8) 的内容之意。 范例二:请将/etc/issue这个文件的内容以8进位列出储存值与ASCII的对照表 [root@www ~]# od -t oCc /etc/issue 0000000 103 145 156 164 117 123 040 162 145 154 145 141 163 145 040 065 C e n t O S r e l e a s e 5 0000020 056 062 040 050 106 151 156 141 154 051 012 113 145 162 156 145 . 2 ( F i n a l ) \n K e r n e 0000040 154 040 134 162 040 157 156 040 141 156 040 134 155 012 012 l \ r o n a n \ m \n \n 0000057 # 如上所示,可以发现每个字节可以对应到的数值为何! # 例如e对应的记录数值为145,转成十进位:1x8^2+4x8+5=101。 |
利用这个命令,可以将 data file 或者是 binary file 的内容数据给他读出来喔! 虽然读出的来数值默认是使用非文字档,亦即是 16 进位的数值来显示的, 不过,我们还是可以透过 -t c 的选项与参数来将数据内的字节以 ASCII 类型的字节来显示, 虽然对於一般使用者来说,这个命令的用处可能不大,但是对於工程师来说, 这个命令可以将 binary file 的内容作一个大致的输出,他们可以看得出东西的啦~ ^_^
如果对纯文字档使用这个命令,你甚至可以发现到 ASCII 与字节的对照表!非常有趣! 例如上述的范例二,你可以发现到每个英文字 e 对照到的数字都是 145,转成十进位你就能够发现那是 101 罗! 如果你有任何程序语言的书,拿出来对照一下 ASCII 的对照表,就能够发现真是正确啊!呵呵!
修改文件时间或建置新档: touch
touch 这个命令最常被使用的情况是:
- 创建一个空的文件;
- 将某个文件日期修订为目前 (mtime 与 atime)
命令档名的搜寻:
我们知道在终端机模式当中,连续输入两次[tab]按键就能够知道使用者有多少命令可以下达。 那你知不知道这些命令的完整档名放在哪里?举例来说,ls 这个常用的命令放在哪里呢? 就透过 which 或 type 来找寻吧!
- which (寻找『运行档』)
[root@www ~]# which [-a] command 选项或参数: -a :将所有由 PATH 目录中可以找到的命令均列出,而不止第一个被找到的命令名称 范例一:分别用root与一般帐号搜寻 ifconfig 这个命令的完整档名 [root@www ~]# which ifconfig /sbin/ifconfig <==用 root 可以找到正确的运行档名喔! [root@www ~]# su - vbird <==切换身份成为 vbird 去! [vbird@www ~]$ which ifconfig /usr/bin/which: no ifconfig in (/usr/kerberos/bin:/usr/local/bin:/bin:/usr/bin :/home/vbird/bin) <==见鬼了!竟然一般身份帐号找不到! # 因为 which 是根据使用者所配置的 PATH 变量内的目录去搜寻可运行档的!所以, # 不同的 PATH 配置内容所找到的命令当然不一样啦!因为 /sbin 不在 vbird 的 # PATH 中,找不到也是理所当然的啊!了乎? [vbird@www ~]$ exit <==记得将身份切换回原本的 root 范例二:用 which 去找出 which 的档名为何? [root@www ~]# which which alias which='alias | /usr/bin/which --tty-only --read-alias --show-dot ' /usr/bin/which # 竟然会有两个 which ,其中一个是 alias 这玩意儿呢!那是啥? # 那就是所谓的『命令别名』,意思是输入 which 会等於后面接的那串命令啦! # 更多的数据我们会在 bash 章节中再来谈的! 范例三:请找出 cd 这个命令的完整档名 [root@www ~]# which cd /usr/bin/which: no cd in (/usr/kerberos/sbin:/usr/kerberos/bin:/usr/local/sbin :/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin) # 瞎密?怎么可能没有 cd ,我明明就能够用 root 运行 cd 的啊! |
这个命令是根据『PATH』这个环境变量所规范的路径,去搜寻『运行档』的档名~ 所以,重点是找出『运行档』而已!且 which 后面接的是『完整档名』喔!若加上 -a 选项,则可以列出所有的可以找到的同名运行档,而非仅显示第一个而已!
最后一个范例最有趣,怎么 cd 这个常用的命令竟然找不到啊!为什么呢?这是因为 cd 是『bash 内建的命令』啦! 但是 which 默认是找 PATH 内所规范的目录,所以当然一定找不到的啊!那怎办?没关系!我们可以透过 type 这个命令喔! 关於 type 的用法我们将在 第十一章的 bash 再来谈!
再来谈一谈怎么搜寻文件吧!在 Linux 底下也有相当优异的搜寻命令呦!通常 find 不很常用的!因为速度慢之外, 也很操硬盘!通常我们都是先使用 whereis 或者是 locate 来检查,如果真的找不到了,才以 find 来搜寻呦! 为什么呢?因为 whereis 与 locate 是利用数据库来搜寻数据,所以相当的快速,而且并没有实际的搜寻硬盘, 比较省时间啦!
- whereis (寻找特定文件)
[root@www ~]# whereis [-bmsu] 文件或目录名 选项与参数: -b :只找 binary 格式的文件 -m :只找在说明档 manual 路径下的文件 -s :只找 source 来源文件 -u :搜寻不在上述三个项目当中的其他特殊文件 范例一:请用不同的身份找出 ifconfig 这个档名 [root@www ~]# whereis ifconfig ifconfig: /sbin/ifconfig /usr/share/man/man8/ifconfig.8.gz [root@www ~]# su - vbird <==切换身份成为 vbird [vbird@www ~]$ whereis ifconfig <==找到同样的结果喔! ifconfig: /sbin/ifconfig /usr/share/man/man8/ifconfig.8.gz [vbird@www ~]$ exit <==回归身份成为 root 去! # 注意看,明明 which 一般使用者找不到的 ifconfig 却可以让 whereis 找到! # 这是因为系统真的有 ifconfig 这个『文件』,但是使用者的 PATH 并没有加入 /sbin # 所以,未来你找不到某些命令时,先用文件搜寻命令找找看再说! 范例二:只找出跟 passwd 有关的『说明文件』档名(man page) [root@www ~]# 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 就可以啦! 如果不加任何选项的话,那么就将所有的数据列出来罗!
那么 whereis 到底是使用什么咚咚呢?为何搜寻的速度会比 find 快这么多? 其实那也没有什么!这是因为 Linux 系统会将系统内的所有文件都记录在一个数据库文件里面, 而当使用 whereis 或者是底下要说的 locate 时,都会以此数据库文件的内容为准, 因此,有的时后你还会发现使用这两个运行档时,会找到已经被杀掉的文件! 而且也找不到最新的刚刚创建的文件呢!这就是因为这两个命令是由数据库当中的结果去搜寻文件的所在啊! 更多与这个数据库有关的说明,请参考下列的 locate 命令。