LinuxShell脚本攻略--第三章 以文件之名
生成任意大小的文件
文件权限、所有权和粘滞位
创建不可修改文件
生成空白文件
查找符号链接及其指向目标
head 与 tail
只列出目录的其他方法
在命令行中用 pushd 和 popd 快速定位(cd -)
统计文件的行数、单词数和字符数
生成任意大小的文件
$ dd if=/dev/zero of=junk.data bs=1M count=1
if代码输入文件(input file), of代表输出文件(output file),bs代表每个文件的大小(block size),count代表需要被复制的块数。
/dev/zero是一个字符设备,它会不断的放回0值字节(\0)。if也可以指定自己的其他文件。
文件权限、所有权和粘滞位
linux系统中每一个文件都与多种类型的权限相关联。这些权限中,我们通常要和三类权限打交道(用户,用户组,其他用户)。用户(user)是文件的所有者。用户组(group)是多个用户的集合(由系统管理员指定),系统允许这些用户对文件进行某种形式的访问。其他用户(others)是除文件用户或用户组之外的任何人。
用命令ls -l查看文件
-rwxrwxr-x 1 fzk fzk 311 12月 6 20:35 test.sh
第一列说明了文件的类型:
- —— 普通文件
d —— 目录
c —— 字符设备
b —— 块设备
l —— 符号链接
s —— 套接字
p —— 管道
剩下的部分可以分为三组,每组三个字符(--- --- ---)。第一组的3个字符(---)对应用户权限(所有者),第二组对应用户组权限,第三组对应其他用户权限。这9个字符(即9个权限)中的每一个字符指明是否其设置了某种权限。如果已设置,对应位置上会出现一个字符,否则出现一个 '-', 表明没有设置对应的权限。
-
用户(权限序列: rwx------ ):第一个字符指定用户是否拥有文件的读权限。如果为用户设置了读权限, r 将出现在第一个字符的位置上。第二个字符指定了写(修改)权限( w ),第三个字符指定了用户是否拥有执行权限( x ,即运行该文件的权限)。可执行文件通常会设置执行权限。用户还有一个称为 setuid ( S )的特殊权限,它出现在执行权限( x )的位置。 setuid 权限允许用户以其拥有者的权限来执行可执行文件,即使这个可执行文件是由其他用户运行的。具有 setuid 权限的文件的权限序列如下: -rwS------ 。目录同样也有读、写、执行权限。不过对于目录来说,读、写、执行权限的含义有点不一样:目录的读权限( r )允许读取目录中文件和子目录的列表;目录的写权限( w )允许在目录中创建或删除文件或目录;目录的执行权限( x )指明是否可以访问目录中的文件和子目录。
-
用户组(权限序列: ---rwx--- ):第二组字符指定了组权限。组权限的 rwx 的含义和用户权限中的一样。组权限并没有 setuid ,但是有一个 setgid ( S )位。它允许以同该目录拥有者所在组相同的有效组权限来允许可执行文件。但是这个组和实际发起命令的用户组未必相同。组权限的权限序列如下: ----rwS--- 。
-
其他用户(权限序列: ------rwx ):最后三个字符是其他用户权限。和用户以及用户组一样,其他用户也有读、写、执行权限,但是并没有 S 权限(如 setuid 和 setgid )。
目录有一个特殊的权限,叫做粘滞位(sticky bit)。如果目录设置了粘滞位,只有创建该目录的用户才能删除目录中的文件,即使用户组和其他用户也有写权限,也无能无力。粘滞位出现在其他用户权限中的执行权限( x )位置。它使用 t 或 T 来表示。如果没有设置执行权限,但设置了粘滞位,就使用 t ;如果同时设置了执行权限和粘滞位,就使用 T 。
例如: ------rwt , ------rwT
$ chmod u=rwx g=rw o=r filename #u代表user g代表group o代表other $ chmod o+x filename #增加用户执行权限 $ chmod a+x filename #a代码所有 $ chmod a-x filename #删除用户执行权限
$ chmod a+x dir -R #dir是目录名,连同子目录下的文件全部增加执行权限。-R在后面
也可用八进制来设置权限。
- r-- = 4
- -w- = 2
- --x = 1
想设置什么权限就把相应的权限对应的数字加和。
chmod u=rwx g=rw o=r filename 和 chmod 764 filename 一个效果
更改所有权
$ chown user.group filename $ chown fzk.fzk test.sh
创建不可修改的文件
$ chattr +i file #设置不可修改
$ chattr -i file #取消不可修改
这样设置完之后就算执行 sudo rm -f file也不能删除
生成空白文件:touch filename
创建链接
$ ln -s target symbolic_link_name
$ ls -l | grep "^l" #查看符号链接
$ find . -type l -print
$ readlink web #查看链接的目标路径
上面中的grep 对ls -l的输出进行过滤,^显示以 l 起始的行,^是字符串的起始标记。也就是每个符号链接的权限(lrwxrwxrwx)都是l开头。
查看文件头几行,后几行(head tail)
$ head file #前10行 $ cat text | head #从stdin读取数据前10行 $ head -n 4 file #读取前4行 $ head -n -5 file #打印除了最后5行之外的其他行 $ seq 11 | head -n -5 #seq 11 能生成1 - 11 $ tail file #打印最后10行 $ cat text | tail $ tail -n 5 file #打印最后5行 $ tail -n +(M+1) #打印除了前M行之外的所有行 $ tail -f growing_file #能随着数据的增长保持更新 $ tail -f file --pid $PID #PID的进程一直向file中写数据,如果PID结束,那么tail也结束。
tail -f 后也可以跟一个 -s 参数,指定多少秒跟新一次。
只列出目录的各种方法
$ ls -d */ $ ls -F | grep "/$" $ ls -l | grep "^d" $ find . -type d -maxdepth 1 -print
目录间快速切换:
$ pushd /var/www #将路径压入栈
$ dirs #查看栈中目录
/usr/src /var/www ~ /usr/share /etc
$ pushd +n #将上面目录从左到右从0开始编号,切换到第n个目录
$ pop #从栈中删除最后一个目录
$ pop +n #删除第n个目录
$ cd - #上个目录之间进行切换,如果只有两个目录,这个方法非常方便
统计文件的行数、单词数和字符数(wc (word count))
$ wc -l file #打印行数
7 file
$ cat file | wc -l
7
$ wc -c file #-w 单次数
$ cat file | wc -w
$ wc -c file #-c 字符数
$ cat file | wc -c
$ wc file #分别打印出行数,单词数,字符数(1435 15763 112200)
$ wc -L #最长的一行长度