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


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版的目录树


你可能感兴趣的:(Linux Shell 脚本攻略 - 第三章 以文件之名)