SHELL笔记之以文件之名(三)

来源:互联网 发布:c语言逻辑或怎么打 编辑:程序博客网 时间:2024/05/01 17:55
1.生成任意大小的文件(dd命令)
eg:   dd if=/dev/zero of=junk.data bs=2M count=3          //该命令创建一个6M大小的文件junk.data  ; if代表输入文件(input file), of代表输出文件(output file),bs代表以字节为单位的块大小(block size),count代表需要被复制的块数。
      注意:使用 dd命令一定要留意,该命令运行在设备底层。出问题搞不好会把磁盘清空或是损坏数据。所以使用时一定要反复检查语法是否正确,尤其是参数of=  ;
  块大小的其他计量单位(  字节(1B)= c ; 字(2B)=w ; 块(512B)=b ; 千字节(1024B)=k ; 兆字节(1024KB)=M;吉字节(1024MB)=G )
 
  /dev/zero是一个字符设备,它会不断返回0值字节(\0)。 如果不指定输入参数(if),默认情况下dd会从stdin中读取输入。类似,如果不指定输出参数(of),则dd会将stdout作为默认输出。

  也可以用dd命令传输大量数据并观察命令输出测试内存的操作速度。

2.文本文件的交集与差集 (comm命令)
----comm必须使用排过序的文件作为输入。(sort A.txt -o  A.txt;   sort B.txt -o B.txt )
  交集:打印出两个文件的所共有的行。
  求差: 打印出指定文件所包含的且互不相同的那些行
  差集:打印出包含在A中,但不包括在其他指定文件中的那些行。

eg:comm A.txt B.txt    //全部输出;(输出的第一列只包含在A中出现的行;第二列只在B.txt中出现的行;第三列包含A.txt和B.txt中相同的行。各列以制表符(\t)作为界定符。)

eg: comm A.txt B.txt -1 -2  //打印出交集(删除第一列和第二列,只打印第三列)

eg: comm A.txt B.txt -3 | sed 's/^\t//'    //打印出两个文件中不相同的行,并去掉行首的制表符(\t).

 原理:comm的命令行选项可以按照需求对输出进行格式化;-1从输出中删除第一列;-2从输出中删除第二列;-3从输出中删除第三列。


3.文件权限,所有权和粘滞位
用户(user)是文件的所有者。
用户组(group)是多个用户的集合(由系统管理员指定),系统允许这些用户对文件进行某种形式的访问。
其他用户(others)是除文件用户或用户组之外的任何人。

粘滞位(sticky bit):目录才有的一个特殊的权限,如果设置了粘滞位,只有创建该目录的用户才能删除目录中的文件,即使用户组和其他用户也有写权限,也无能为力。粘滞位出现在其他用户权限中的执行权限位置。使用t或T表示,如果没有设置执行权限,但设置了粘滞位,就是用t;如果同时设置了执行权限和粘滞位,就是用T。

用户还有一个称为setuid(S)的特殊权限,它出现在执行权限(x)的位置。setuid权限允许用户以其他拥有者的权限来执行可执行文件,即使用这个可执行文件是由其他用户运行的。具有setuid权限的文件的权限序列如下:-rwS------。

eg: chmod a+x filename    //给所有权限类别增加可执行权限

eg:chown  nagios.nagios test.c   //更改所有权(将文件test.c的用户和用户组改成nagios ) 格式:chown  user.group filename

eg: chmod a+t   directory_name   // 设置粘滞位

eg: chmod 777 . -R   //以递归的方式设置权限,修改当前目录下的所有文件和子目录的权限(等价于:chmod 777 "$(pwd)" -R )

eg: chown user.group .  -R    //以递归的方式设置所有权

以不同的身份运行可执行文件
(首先将文件的所有权替换为需要执行该文件的用户,然后以该用户的身份登录。)
 $ chmod +s executable_file 
 # chown root.root executable_file
 # chmod +s executable_file   //设置setuid的特殊权限
 $  ./executable_file    
(现在这个文件实际上每次都以root用户的身份来执行) setuid的使用不是无限制的。为了确保安全,它只能应用在linux ELF格式二进制文件上,而不用于脚本文件。


4.创建不可修改的文件(chattr命令)
eg: chattr +i file  //将文件设置为不可修改(一旦设置,任何用户,包括超级用户都不能删除该文件,除非其不可修改的属性被移除)

eg: chattr -i  file //移除不可修改属性


5.批量生成空白文件
 touch命令可以用来生成空白文件或是修改文件的时间戳(如果文件已经存在)。
      touch -a  filename:只更改文件的访问时间
      touch -m filename:只更改文件内容修改时间
      touch -d “Sun Jun 14 12:42:08 CST 2015” filename //指定特定时间和日期为时间戳
-------------------------
eg:批量生成不同名字的空白文件
for name in  {1..100}.txt
do
    touch $name
done
-----------------------

6.列举文件类型统计信息
eg: file test.c   //打印文件类型信息(test.c: ASCII text )
eg: file -b test.c   //打印不包括文件名在内的文件类型信息(ASCII text )

----------------------
eg:生成文件统计信息的脚本(目前还有错误)

#!/bin/bash
# filename: filesstat.sh

if [ $# -ne 1 ];
then
  echo "Usage is $0 bashepath";
  exit
fi

path=$1

declare -A statarray;

while read line;
do
   ftype='file -b $line | cut -d, -f1'
   let statarray["$ftype"]++;

done < <( find $path -type f -print )

echo ===========File types and counts==========
for ftype in "${!statarray[@]}";
do
   echo $ftype : ${statarray["$ftype"]}
done

---------------------------------------------- 

6.环回文件
  环回文件系统是指那些在文件中而非物理设备中创建的文件系统。
--------------------------------
eg:如何在大小为1GB的文件中创建ext4文件系统
$ dd if=/dev/zero  of=loopbackfile.img bs=1G count=1   //创建1G大小的文件
$  mkfs.ext4 loopbackfile.img    //用mkfs命令将1GB的文件格式化成ext4文件系统
$ file loopbackfile.img    //使用下面的命令检查文件系统
$ mount -o loop loopbackfile.img  /mnt/loopback    //挂载环回文件(-o loop 用来挂载环回文件系统);这实际是一种快捷的挂载方法,我们无需手动连接设备,但是在内部,这个环回文件连接到了一个名为/dev/loop1或loop2的设备上。(手动操作:命令一: losetup  /dev/loop1 loopbackfile.img    命令二:mount /dev/loop1  /mnt/loopback  )
$ umount  /mnt/loopback    //卸载挂载  


7.ISO文件及混合ISO
 7.1 
从/dev/cdrom创建一个ISO镜像
  cat  /dev/cdrom >image.iso  //从/dev/cdrom创建一个ISO镜像,尽管可以奏效,最好使用dd工具,如下
  dd  if=/dev/cdrom of=image.iso

 7.2将整个文件夹写入ISO文件
   mkisofs -V  "Label" -o image.iso  source_dir/     //mkisofs命令用于创建ISO文件系统(用这个命令将整个目录的内容写入一个ISO文件)
 
 7.3生成可以引导的混合ISO文件
 eg:能够启动闪存或硬盘的混合ISO文件
    #  isohybrid image.iso     //获得一个名为image.iso的混合ISO,它可用于写入USB存储设备。(isohybrid是一个比较新的工具,你可以从http://syslinux.zytor.com下载syslinux软件包。)
   #   dd if=image.iso  of=/dev/sdb1       //将用isohybrid生成的混合ISO文件写入USB存储设备

7.4将ISO文件刻录到CD-ROM或DVD-ROM
  cdrecord -v  dev=/dev/cdrom   image.iso  


8.查找文件差异并进行修补
修补文件(patch file):只包含那些被修改过,添加或删除的行以及行号。
 diff  命令生成差异文件(-u选项用于生成一体化输出。因为一体化输出的可读性更好,便于看出两个文件之间的差异)

 diff -u  version1.txt version2.txt > version.patch   //生成差异文件version.patch

 patch -p1  version1.txt < version.patch   //修补version1.txt (现在version1.txt内容和version2.txt内容一模一样)
 如下撤消修改:在执行一遍上面的命令,则又恢复到之前的状态。

8.2生成目录的差异信息
  diff  -Naur    directory1  directory2    (-N :将缺失的文件视为空文件。  -a :将所有文件视为文本文件。  -u:生成一体化输出。 -r:遍历目录下的所有文件。)


9.使用head和tail打印文件的前10行和后10行
9.1  head命令
eg: head file   //打印前10行
eg:cat text  | head   
eg: head -n  4   file    //打印文件前4行
eg:head -n -M file  //打印最后M行之外的所有的行  (-M表示一个负数,而不是选项)

9.2 tail命令
eg: tail file  //打印文件的最后10行
eg:cat txt | tail    
eg: tail -n  5   file   //打印文件的最后5行
eg: tail  -n +(M+1)   file  //打印除前M行之外的所有行,即M+1行到最后

eg: tail -f   growing_file   //打印最后10行最新的数据


10.只列出目录的各种方法
 eg: ls -d */       
 eg: ls -F | grep "/$"   
 eg: ls -l | grep "^d"
 eg: find . type d -maxdepth 1 -print

11.统计文件的行数,单词数和字符数
eg:wc -l  file   //统计行(cat file | wc -l )
eg: wc -w  file  //统计单词数
eg:wc -c  file   //统计字符数
eg:wc file -L   //打印文件中最长的一行的长度

12.打印目录树
tree命令可以以图形化的树状结构打印文件和目录。 (在linux发行版本中通常并没有包含这个命令。)

eg: tree  path
eg:tree path -P  PATTERN    //重点标记处匹配某种样式的文件
eg: tree path  -I  PATTERN   //重点标记出除符合某种样式之外的那些文件
eg: tree -h     //打印出文件和目录的大小

eg:以HTML形式输出目录树
tree   path   -H  http://www.xiebo.com  -o  xb.html

0 0
原创粉丝点击