Unix文件管理

  前不久,我和范斯聊起了关于Unix文件管理方面的话题,范斯和我说,在Unix中,所有的数据都被组织为文件(files),所有的文件读被组织在目录中,所有的目录都被维护在一个树形结构中,即文件系统。
  我问范斯,既然如此,那么在Unix中,一共多少种文件类型。范斯说,一共有三种:

  • 普通文件:数据、文本、程序;
  • 目录:目录用来存放普通文件和特殊文件;
  • 特殊文件:一些特殊文件可以和硬件打交道,比如硬件驱动;还有一些特殊文件类似于别名(或者简称),可以用不同的名字来访问相同的文件。

Listing Files

  列出当前目录中的文件和目录,我们可以使用下面命令行:

$ls

hadoop@ubuntu:/$ ls
bin    initrd.img      mnt   snap  vmlinuz
boot   initrd.img.old  opt   srv   vmlinuz.old
cdrom  lib             proc  sys
dev    lib64           root  tmp
etc    lost+found      run   usr
home   media           sbin  var

  ls支持-l,以获得更多信息:

hadoop@ubuntu:/usr/local$ ls -l
total 192
drwxr-xr-x  3 hadoop hadoop   4096 Jan  7 03:47 bigdatacase
drwxr-xr-x  2 root   root     4096 Aug  1 04:17 bin
drwxr-xr-x  2 root   root     4096 Aug  1 04:17 etc
drwxr-xr-x  2 root   root     4096 Aug  1 04:17 games
drwxrwxr-x 12 hadoop qiao     4096 Jan  7 03:07 hadoop
drwxr-xr-x  8 hadoop hadoop   4096 Jan  7 03:23 hive
  • 第一列:文件类型和文件权限
  • 第二列:文件/目录所占用的内存块数量
  • 第三列:文件所有者
  • 第四列:文件所有者所属组
  • 第五列:文件/目录大小(单位:byte)
  • 第六列:文件/目录最后一次修改时间
  • 第七列:文件/目录名字

其中第一列的文件类型一共有以下几种:

  • -:普通文件,比如文本文件、可执行文件等
  • b:块特殊文件(Block special file)。块输入/输出设备文件
  • c:字符特殊文件(Character special file)。原始输入/输出设备文件
  • d:目录文件
  • l:链接文件(Symbolic link file)
  • p:命名管道(named pipe),用于进程通信
  • s:套接字,用于进程通信

Metacharacters(元字符)

  我问范斯,假如我想列出某些特定的文件呢?范斯说,我们可以使用元字符来达到这个目的。比如,*?就是元字符。

*用来匹配0个或者多个字符,?用来匹配单个字符。

  假如,我们要找到以ch开头,以.doc结尾的所有文件,我们可以这样写:

$ls ch*.doc
ch01-1.doc   ch010.doc  ch02.doc    ch03-2.doc 
ch04-1.doc   ch040.doc  ch05.doc    ch06-2.doc
ch01-2.doc ch02-1.doc

  当然,如果我们想找所有的.doc文件,我们可以这样写:

$ls *.doc

Hidden Files(隐藏文件)

在Unix中,隐藏文件是以.开头的文件,Unix程序(包括shell)使用隐藏文件来存放配置信息。

$ ls -a

.         .profile       docs     lib     test_results
..        .rhosts        hosts    pub     users
.emacs    bin            hw1      res.01  work
  • .:表示当前目录
  • ..:表示上级目录

Creating Files and Editing Files

  我们可以使用vim来创建和编辑文件:

$vim filename

查看文件内容

  我们可以使用cat filename来查看文件内容。

hadoop@ubuntu:/usr/local/R$ cat action.r
library(RMySQL)
conn <- dbConnect(MySQL(), dbname='dblab', username='root', password='root', host='127.0.0.1', port=3306)
query = 'select * from user_action LIMIT 100000'
user_action <- dbGetQuery(conn,query)

  我们可以使用-b来显示行号:

hadoop@ubuntu:/usr/local/R$ cat -b action.r 
     1  library(RMySQL)
     2  conn <- dbConnect(MySQL(), dbname='dblab', username='root', password='root', host='127.0.0.1', port=3306)
     3  query = 'select * from user_action LIMIT 100000'

统计文件字符

hadoop@ubuntu:/usr/local/R$ wc action.r 
 18  40 564 action.r
  • 第一列:文件总行数
  • 第二列:文件word总数
  • 第三列:文件大小(byte)
  • 第四列:文件名字

文件复制

$ cp source_file destination_file

文件重命名

mv old_file new_file

删除文件

rm filename

删除文件建议使用rm -i filename

Standard Unix Streams

  • stdin:标准输入流,文件描述符是0,或者STDIN
  • stdout:标准输出流,文件描述符是1,或者STDOUT
  • stderr:标准错误流,文件描述符是2,或者STDERR