LinuxShell脚本攻略-第三章以文件之名


3.1 生成任意大小文件

1 创建特定大小的文件最简单的方法是使用dd命令,dd命令会克隆给定的输入内容,然后将一份一模一样的副本写道输出

2 stdin,设备文件,普通文件等都可以作为输入,stdout,设备文件,普通文件等也可以作为输出

3 例子: dd if=/dev/zero of=data bs=1M count=1

该命令会在当面目录创建一个1MB大小的文件data,来看一下参数,if代表输入文件,of代表输出文件,bs代表以字节为单位的块大小,count表示要被复制的块数

4 我们将bs指定为1MB,count为1,于是得到了一个大小为1MB的文件,如果把count指定为2则得到2MB的文件

5 /dev/zero是一个字符设备,他会不断返回0值字节(\0)

6 如果不指定输入参数,默认情况是从stdin中读取输入,与之类似,如果不指定输出参数则默认会将stdout作为输出

 

3.2 文本文件的交集和差集

1 comm命令可以用于两个文件之间的比较,它有很多不错的选项来调整输出

2 例子: comm fileA fileB

输出的第一列包含在fileA中出现行,第二列包含在fileB中出现的行,第三列包含在fileA和fileB中相同的行

有一些选项可以按照我们需求进行格式化输出

-1 从输出中删除第一列

-2 从输出中删除第二列

-3 从输出中删除第三列

 

3.3 查找并删除重复文件

1 重复文件指的是那些虽然名字不同但是内容却一模一样的文件

2 校验和是通过文件的内容来的,内容相同的文件校验和是一样的

 

3.4 创建长路径目录

1 mkdir命令用于创建目录,如果目录已经存在会返回错误信息

2 -e是条件判断[]中的参数,可以用来判断某个文件是否存在,在类UNIX中,目录同样是一个文件

 

3.5 文件权限和所有权

1 用户是文件所有者,用户组是多个用户的集合,系统允许这些用户对文件以某种形式进行访问

2 用命令ls -l可以列出文件的权限

比如: -rw-r--r-- 1 chenguolin chenguolin 2497 2014-01-19 21:02 hehe.txt

3 第一列总共有10个字符,第一个字符表示的是文件的类型,'-'是普通文件,'d'是目录文件,’c'字符设备等等

剩下的9个字符可以分成三组,每组三个字符。第一组的三个字符是用户权限,第二组的三个字符是用户组权限,第三组的三个字符是其他用户。

权限序列rwx,分别表示读写执行权限

4 目录同样也具有读写执行权限,不过目录相对于普通文件来说是不一样的

目录的读权限r 允许读取目录文件和子目录的列表

目录的写权限w 允许目录中创建或删除文件或目录

目录的执行权限 指明可以访问目录中的文件和子目录

5 为了设置文件权限,可以使用chmod命令

chmod u=rwx g=rw o=r filename

在这里: u指的是用户权限,g指的是用户组权限,o是指其它人实体权限

如果需要给文件添加权限,可以对用户,用户组和其他用户+进行添加,用-进行删除权限

我们也可以利用八进制来设置权限,权限由3位数来表示,每一位按顺序分别对应用户,用户组和其他用户

r对应的值为4,w对应的值为2,x对应的值为1

6 我们可以使用chown来更改文件的所有权

chown user.group filename // 这样是把文件filename的所有者改为user,用户组为group

7 有时候要以递归的方式修改当前目录下的所有文件和子目录的权限,可以使用下面的方法

chmod 777 path -R //这个例子就是递归把path目录下的所有文件的权限修改为777

8 同理我们也可以利用-R来递归修改文件的所有者

chown user.group path -R //这个命令就是递归把path目录下的所有文件的所有者和用户组修改掉

 

3.6 创建不可修改的文件

1 一旦文件被设置为不可修改,任何用户包括超级用户都不能删除该文件,除非其不可修改的属性被移除

2 可以用chattr将文件设置为不可修改

sudo chattr +i file //这样文件file就变为了不可修改

3 如果需要使得文件可以写,直接使用sudo chattr -i file来修改权限

3.7 批量生成空白文件

1 touch命令可以用来生成空白文件,如果文件存在,则可以用它来修改文件的时间撮

2 touch file // 如果文件不存在则创建一个文件否则直接修改该文件的时间戳

3 如果我们只是想修改某些时间戳,则可以使用下面的选项

touch -a 只更改文件访问时间

touch -m 只更改文件内容修改时间

 

3.8 查找符号链接及其指向目标

1 符号链接不过是指向其他文件的指针,它在功能上类似Mac OS中的别名或windows中的快捷方式

2 我们可以按照下面的方式创建链接

ln -s file link //该命令为文件file创建一个连接link

 

3.9 列举文件类型统计信息

1 我们可以使用file命令来打印文件类型

file filename //可以打印处filename的文件类型

 

3.10 环回文件及挂载

1 为了使用存储设备上面的文件系统,我们需要将其挂载到一些被称为挂载点的目录上

2 前面介绍了可以使用dd命令创建一个大的文件,那么我们可以使用mkfs这个命令来格式化设备

mkfs.ext4 /dev/sdb1 // 这个命令就是把/dev/sdb1格式化成ext4文件类型

3 我们可以使用mount来挂载

mount /dev/sdb1 /mnt/usb //这个命令就是把/dev/sdb1 挂载到/mnt/usb

4 如果要卸载使用下面的方法

umount /dev/sdb1 或 umount /mnt/usb

因为umount是一个特权命令,所以必须以超级用户的身份来执行

 

3.11 查找文件差异进行修补

1 我们可以使用patch(补丁文件)来更改文件信息

2 diff命令可以用来比较两个文件,最常用的用法是diff fileA fileB

我们还可以使用-u选项来进行一体化输出 diff -u fileA fileB

3 在一体化输出中,以+起始的是新加入的行,以-起始的是删除的行

diff -u fileA fileB > patch // 这个命令把两个文件的差异信息重定向到patch文件

4 用下面的命令来修补

patch -p1 file < patch // 这个命令可以把file进行差异更新

如果要撤销修改直接进行同样的命令即可

3.12 head和tail

1 head命令总是读取输入文件的头部 head file打印文件file的前10行

2 seq命令可以用来快速的生成一个序列 seq 11用来生成1~11的序列

3 tail命令打印文件的最后10行 tail file

 

3.13 只列出目录的方法

第一种:ls -d */ // 只有上面这种结合-d的用法才能够只打印出目录

第二种:ls -F | grep "/$" // 当使用-F时,所有输出项都会添加上一个代表文件类型的字符

第三种:ls -l | grep "^d" // ls -l输出的每一行,然后利用grep找到第一个字符是d的

第四种:find path -maxdepth 1 -type d -print // find命令指定最大的查找深度还有文件类型

3.14 统计文件的行数,单词数和字符数

1 wc是一个用于统计的工具,它是word count的缩写

2 统计行数: wc -l file

统计单词数: wc -w file

统计字符数: wc -c file

wc file默认打印出文件行数,单词数还有字符数

3 wc file -L可以用来打印出最长行的长度

3.15 打印目录树

1 tree命令是以图形化的树状结构打印文件和目录的主角,通常在Linux的发型版本中并没要该命令

2 tree path // 这个命令可以直接以树形来显示

3 以HTML形式输出目录树

tree path -H http://localhost -o out.html

将http://localhost替换为适合存放输出文件的URL,将path替换为真的路径,然后就可以生成web版的目录树

相关内容