|
今天看书,无意中对几个shell常用命令有了一些新体会,拿出来博大家一笑,希望能加深大家对shell的认识。(本文是写给初学者的,高手们就不用看了。)
我相信大家都已经知道ls命令的作用,如果不带参数,ls将会列出当前目录下的文件名,并以字母顺序排列出来。如:
[kj501@c4 tmp]$ ls
1 11 2 29 dd kk vv
那么要以其它顺序排列文件,比如说以文件使用时间排列文件,应该怎么办? 这个问题也非常简单,加上-u 参数就行了。如
[kj501@c4 tmp]$ ls -u
dd vv kk 29 11 2 1
如果加上的是-t 参数,则会以修改时间排列文件:
[kj501@c4 tmp]$ ls -t
vv kk dd 29 11 2 1
可以看到文件排列顺序发生了变化,但是否确实按照时间来排列呢? 用-l 参数可以显示文件的详细信息。如:
[kj501@c4 tmp]$ ls -l
总用量 0
-rw-r--r-- 1 kj501 kj501 0 1月 25 11:02 1
-rw-r--r-- 1 kj501 kj501 0 1月 25 11:03 11
-rw-r--r-- 1 kj501 kj501 0 1月 25 11:02 2
-rw-r--r-- 1 kj501 kj501 0 1月 25 11:03 29
-rw-r--r-- 1 kj501 kj501 0 1月 25 11:03 dd
-rw-r--r-- 1 kj501 kj501 0 1月 25 11:03 kk
-rw-r--r-- 1 kj501 kj501 0 1月 25 11:03 vv
这样,我们可以很清楚的看到,-t 参数是以最后修改的时间来排序文件的,而且是越近的越排在前面。把这两个参数组合在一起,就可以按修改时间排列文件并显示详细信息:
[kj501@c4 tmp]$ ls -lt
总用量 0
-rw-r--r-- 1 kj501 kj501 0 1月 25 11:03 vv
-rw-r--r-- 1 kj501 kj501 0 1月 25 11:03 kk
-rw-r--r-- 1 kj501 kj501 0 1月 25 11:03 dd
-rw-r--r-- 1 kj501 kj501 0 1月 25 11:03 29
-rw-r--r-- 1 kj501 kj501 0 1月 25 11:03 11
-rw-r--r-- 1 kj501 kj501 0 1月 25 11:02 2
-rw-r--r-- 1 kj501 kj501 0 1月 25 11:02 1
但如果要把顺序反过来,即最后修改的文件排列在后面,最先修改的文件排列在前面,可以再加上一个参数-r,如:
[kj501@c4 tmp]$ ls -ltr
总用量 0
-rw-r--r-- 1 kj501 kj501 0 1月 25 11:02 1
-rw-r--r-- 1 kj501 kj501 0 1月 25 11:02 2
-rw-r--r-- 1 kj501 kj501 0 1月 25 11:03 11
-rw-r--r-- 1 kj501 kj501 0 1月 25 11:03 29
-rw-r--r-- 1 kj501 kj501 0 1月 25 11:03 dd
-rw-r--r-- 1 kj501 kj501 0 1月 25 11:03 kk
-rw-r--r-- 1 kj501 kj501 0 1月 25 11:03 vv
我们可以看到顺序完全倒过来了。以此类推,ls -lut 会按照最新使用的顺序排列文件。ls -lurt 会用最后使用的顺序排列文件。
[kj501@c4 tmp]$ ls -lurt
总用量 0
-rw-r--r-- 1 kj501 kj501 0 1月 25 11:02 1
-rw-r--r-- 1 kj501 kj501 0 1月 25 11:02 2
-rw-r--r-- 1 kj501 kj501 0 1月 25 11:03 11
-rw-r--r-- 1 kj501 kj501 0 1月 25 11:03 29
-rw-r--r-- 1 kj501 kj501 0 1月 25 11:03 kk
-rw-r--r-- 1 kj501 kj501 0 1月 25 11:03 vv
-rw-r--r-- 1 kj501 kj501 0 1月 25 11:10 dd
大家细心一点会发现,文件dd的时间与前面不一样。这个我可没有弄错,大家想想是什么道理吧。
接着,我们再来看看sort的用法。我们可以把sort和ls命令组合起来,实现对文件名的排序。如:
[kj501@c4 tmp]$ ls | sort
1
11
2
29
dd
kk
vv
大家一定会看到11比2 大,却排在前面,这是因为sort没有按数字大小排列造成的。要按数字大小排列,用sort -n,如:
[kj501@c4 tmp]$ ls | sort -n
dd
kk
vv
1
2
11
29
当然,根据前面学到的知识,用-r可以把顺序反过来。
[kj501@c4 tmp]$ ls | sort -nr
29
11
2
1
vv
kk
dd
下面,再来看看重定向的问题。如前所述,用ls命令时,显示如下内容:
[kj501@c4 tmp]$ ls
1 11 2 29 dd kk vv
如果用ls > temp,文件temp的内容会与上面ls出来的结果完全一样吗?
[kj501@c4 tmp]$ ls > temp
[kj501@c4 tmp]$ cat temp
1
11
2
29
dd
kk
temp
vv
呵呵,很奇怪吧,temp居然也在其中。没关系,原因下面再解释。我们先来看看这个:
[kj501@c4 tmp]$ rm temp
rm:是否删除一般空文件 temp ? y
[kj501@c4 tmp]$ vv > temp
bash: vv: command not found
[kj501@c4 tmp]$ ls
1 11 2 29 dd kk temp vv
[kj501@c4 tmp]$ cat temp
[kj501@c4 tmp]$
我们可以看到,在删除temp文件后,执行vv > temp命令失败,因为在linux中是没有vv这个命令的。但是接着用ls命令查看文件时,我们发现temp文件以出现了。当用cat命令查看temp的内容时,却发现它是一个什么也没有的空文件。
由此,我们可以得出shell在执行vv > temp时的过程。首先是检查有没有temp这个文件,如果没有,就创建它。然后再执行vv,并把结果输出到temp中。当然,由于找不到vv命令,执行失败了,但仍然在磁盘上留下了temp文件。从这个结果,我们也可得出,重定向符号的一端,必须是命令,否则,执行必然会失败。这一点与管道不同,在管道符号的两端,都要是命令,如果有一个是文件名,反而会出问题。不信,你试试看。 |
|