shell学习小记1


以下内容为本人学习《Linux Shell脚本攻略》的一些笔记。如果你想好好学shell的话,个人非常推荐这本书。

关于软链接和链接文件

除了常规的ls -l找出链接文件之外,还有以下两种方式:

readline link_file

上面的命令直接打印链接文件的目标文件。

find -type l

上面的命令查找当前目录下的所有链接文件。

链接文件的方式基本上都是ln命令,ln的参数-s指定创建的是软链接文件而不是硬链接。软链接和硬链接的主要区别个人归纳为:

  • 目录必须用软链接
  • 软链接支持跨分区,硬链接不行
  • 硬链接创建的文件和原始文件大小一致

文件的权限和特殊位

常见的文件的权限表示是-rw-r–r–,通过ls -l即可显示。第一位常见的是-,表示文件;d表示目录;l表示链接文件。rwx相信不用多说,但是用户的x可以通过setuid设置为S,效果是以文件创建者的名义执行,据说仅能应用于ELF文件,命令为

chmod +s

组的rwx的第三位也可以通过setgid设置为S,用创建者组的名义执行。第三个rwx的第三位可以设置为t/T,仅能应用与目录,表示仅有目录创建者才有权删除目录内的文件,即时其他人有写权限,典型的例子是/tmp目录。

还有一个小的tip是保护某个文件不能被删除可以用

chattr +i filename

这样其他人就不能直接删除这个文件了。取消保护可以通过chattr -i filename。

快速创建一个指定大小的文件

dd if=/dev/zero count=1 bs=1M of=1m.dat

if表示来源文件,默认是标准输入。count和bs的乘积为最终文件大小。of是输出文件,默认是标准输出。/dev/zero是一个特殊的输入,任何时候读取都返回\0,用来填充文件很不错。

类集合操作

首先要求输入文件A和B必须排好序。方法如下:

sort a.txt -o a.txt

-o表示输出文件,不用担心,不会出现乱写的情况。b.txt类似命令。
接下来用comm命令

comm a.txt b.txt

输出有三列,第一列是a.txt独有的,第二列是b.txt独有的,第三列是两个文件共有的。
所以最简单的,合集只需要显示第三列就可以了,命令是:

comm a.txt b.txt -1 -2

-1 -2表示不显示第一列和第二列。
A – B和B – A的情况分别对应于第一列和第二列。以A – B为例:

comm a.txt b.txt -2 -3 | sed 's/^\t//'

最后的sed是为了去除前导TAB。可以先看下用sed的效果,然后再加上去。
合集是个人理解:

comm a.txt b.txt | sed 's/^\t*//'

以上就是个人今天学习的一点笔记,之后还会有更多的笔记上来。

,