linux命令详解(15)文件和目录操作 touch 、file、mkdir、ln、mknod、mkfifo命令详解

2014-12-8 20:11:14     21 人阅读    

Linux文件系统里的一切皆可视作文件,包括数据文件、目录、设备、命名管道、链接和其他各类文件。各个文件还关联一组信息,决定哪些用户能够访问以及如何访问该文件。本章介绍了大量用于探索和处理文件的命令。
 理解文件类型
目录和普通文件是最常用的文件类型。当然,使用Linux时还会碰到其他几种文件类型。在命令行里,有许多种方式可以创建、查找和列出各类文件。
能够访问计算机硬件组件的文件称为设备文件,包括字符设备和块设备。使用硬链接和符号链接可以从不同位置访问同一个文件。普通用户较少直接使用,命名管道和套接字,两者为进程间通信提供通路。
 使用普通文件
普通文件包括数据文件(文档、音乐、图像、归档文件等)和命令(二进制和脚本),使用file命令可以确定文件的类型。下面的示例会切到bash shell文档所在目录,并用file命令查看其中部分文件类型:

$ cd /usr/share/doc/bash*
$ file article* bash*
article.ms:   ASCII troff or preprocessor input text
article.ps:   PostScript document text conforming at level 3.0
article.txt:  ASCII English text, with escape sequences, with overstriking
bashdb:       directory
bash.html:    HTML document text

上面运行的file命令表明,bash shell提供了多种格式的文档文件。file命令会查看文件内容,确定文件是否包含troff标记(用于手册页和旧的Unix文档)、PostScript(可直接传送给打印机)、纯文本或HTML(网页)标记,此外还能判断子目录(bashdb)。
能保存数据的应用程序就能创建普通文件。只想创建一些空白文件供后续处理用,也有很多种,下面是其中两种:

$ touch /tmp/newfile.txt          创建空白文件
$ > /tmp/newfile2.txt             创建空白文件

确定文件类型的另一种方法是列出文件的详细信息,如下所示:

$ ls -l /tmp/newfile2.txt         列出文件详细信息查看其类型
-rw-rw-r--  1 chris chris 0 Sep 5 14:19 newfile2

文件权限信息由10个字符组成(-rw-rw-r--),第一个字符为短划线,表明该文件为普通文件。本章后面的4.2节会介绍权限相关内容。命令也是普通文件,只不过存为可执行文件,示例如下:

$ ls -l /usr/bin/apropos
-rwxr-xr-x  1 root root 1786 Feb 13  1006 /usr/bin/apropos
$ file /usr/bin/apropos
/usr/bin/apropos: Bourne shell script text executable
$ file /bin/ls
/bin/ls: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), for GNU/Linux
2.2.5, dynamically linked (uses shared libs), for GNU/Linux

从上面的示例输出可知,apropos命令是可执行文件,对属主、用户组和其他用户都设置了x(可执行)权限。对apropos调用file命令,执行结果显示apropos为shell脚本,与后面给出的二进制可执行文件如ls命令有所不同。
 使用目录
目录是文件和子目录的容器。目录从根(/)到多级子目录一层层创建,各层目录之间用斜杆(/)分隔。在图形界面文件管理器中,目录又称文件夹。
mkdir命令可以新建目录以存储数据。下面几个示例使用mkdir以不同方式创建目录:

$ mkdir /tmp/new            在/tmp下创建"new"目录
$ mkdir -p /tmp/a/b/c/new   根据需要创建"new"的上层目录
$ mkdir -m 700 /tmp/new2    创建new2目录,权限为drwx------

第一个mkdir命令很简单,只是在现有/tmp目录下新建new目录。第二个例子会根据需要创建目录(子目录a、b和c),最终创建new目录。最后一个命令包含-m选项,创建目录的同时设定目录权限。
对于目录,10字符权限字符串的第一个字符为d,因此识别文件是否为目录也很简单:

$ file /tmp/new
/tmp/new: directory
$ ls -l /tmp/new
drwxr-xr-x  2 chris chris 4096 Sep  5 14:53  /tmp/new

另外,需要注意一点,要让用户能切换到该目录,其可执行位(x)必须打开。
 使用符号链接和硬链接
创建文件的链接,就可以从多处不同位置访问同一个文件,不必在文件系统里到处复制文件和目录。Linux支持软链接(通常称为符号链接)和硬链接。
尝试打开指向文件的符号链接或进入指向目录的符号链接时,运行的命令会直接作用于该链接所指的目标文件或目录。目标本身有一组权限和所有权,从符号链接看不出来。符号链接与目标不一定位于同一个磁盘分区。实际上,即使目标不存在,符号链接也能独立存在。
硬链接只能用于文件(而不是目录),实质上就是给同一个实体文件取多个名字。每个实体文件至少有一个硬链接,通常就是文件本身。所有指向同一实体文件的新名字(硬链接)与原目标文件必须位于同一个分区。实际上,辨别多个文件为硬链接的一种做法是,查看这些文件的inode号是否相同。更改指向文件的任意硬链接的权限、所有权、日期/时戳或内容,最终也会更改其他硬链接或原文件。不过,删除其中一个链接并不会删除所指文件,该文件仍会存在,直至指向文件的最后一个链接删除。
可以使用ln命令创建硬链接和符号链接,示例如下:

$ touch myfile
$ ln myfile myfile-hardlink
$ ln -s myfile myfile-symlink
$ ls -li myfile*
292007 -rw-rw-r--  3 francois francois 0 Mar 25 00:07 myfile
292007 -rw-rw-r--  3 francois francois 0 Mar 25 00:07 myfile-hardlink
292008 lrwxrwxrwx  2 francois francois 6 Mar 25 00:09 myfile-symlink

首先在创建硬链接和符号链接文件,并使用ls -li命令查看文件信息,选项-li会显示各个文件关联的inode。从上面的例子可以看出,myfile和myfile-hardlink的inode号皆为292007,意味着两者在硬盘中实际上是同一个文件。符号链接myfile-symlink的inode号则与之不同。另外,硬链接只是显示为文件(-),而符号链接则识别成链接(l),且权限全部放开。由此无法判断能否访问该符号链接所指文件,只有尝试访问这个符号链接或查看链接目标信息之后才知道结果。
 使用设备文件
应用程序需要与计算机硬件通信时,会将数据写入设备文件。按惯例,设备文件全都位于/dev目录。设备大体分为块设备(如存储介质)和字符设备(如串口和终端设备)。
每个设备文件都关联一个主设备号(指示设备类型)和一个次设备号(指示该设备序号)。例如,终端(tty)设备由主字符设备号4表示,SCSI硬盘则由主块设备号8表示。下面列举两个设备文件:

$ ls -l /dev/tty0 /dev/sda1   列出字符设备和块设备
brw-r----- 1 root disk 8, 1 2007-09-05 08:34 /dev/sda1
crw-rw---- 1 root root 4, 0 2007-09-05 08:34 /dev/tty0

Fedora中可用的设备名称和设备号(由Linux统一分配)清单参见/usr/share/doc/ MAKEDEV-*/devices.txt文件。系统启动时会根据/etc/makedev.d目录下的条目自动创建大部分设备文件,因此大部分用户从不手工创建设备文件。不过,必要时用户可以使用mknod命令自行创建设备文件,示例如下:

# mknod /dev/ttyS4 c 4 68   为第五个串口添加设备
$ ls -l /dev/ttyS4          列出新建的设备文件
crw-r--r--  1 root root 4, 68 Sep  6 00:35 /dev/ttyS4
 使用命名管道和套接字
一个进程需要向另一个进程发送信息时,可以直接用管道(|)将前者的输出传给后者,作为后者的输入。不过,若要在文件系统里提供中介,使得某个进程借此与其他进程通信,可以创建命名管道或套接字。命名管道一般用于本地进程间通信,套接字则用于网络进程间通信。
应用程序往往会在/tmp目录下建立命名管道和套接字,下面列举几个命名管道和套接字:

$ ls -l /tmp/.TV-chris/tvtimefifo-local /tmp/.X11-unix/X0
prw-------  1 chris chris 0 Sep 26  2007 /tmp/.TV-chris/tvtimefifo-local
srwxrwxrwx  1 root  chris 0 Sep  4 01:30 /tmp/.X11-unix/X0

第一行输出结果是个命名管道,由电视卡播放器tvtime创建(注意首字符p表示命名管道)。第二行是由X GUI为进程间通信创建的套接字。
使用mkfifo命令可以创建自己的命名管道,如下所示:

$ mkfifo mypipe
$ ls -l mypipe
prw-rw-r--  1 chris chris 0 Sep 26 00:57 mypipe

使用mkfifo命令创建自己的套按字,如下所示:

$ /usr/sbin/mksock mysock
$ ls -l mysock
srwxrwxr-x 1 chris chris 0 Sep 26 00:57 mysock

不开发应用程序的话,一般不需要创建命名管道或套接字。使用find命令加上-type选项,可以查找系统中现有的命名管道和套接字,本章稍后会介绍。

本文是作者在读取《linux命令详解手册》之后的随手笔记,如果大家喜欢这本书,可以去购买


原文地址:http://www.itmmd.com/201412/280.html
该文章由 萌萌的IT人 整理发布,转载须标明出处。

产品经理学习笔记(8)-如何找到真实的需求   上一篇
下一篇  linux命令详解(14)shell脚本学习,创建简单的shell脚本

精彩回复
发表评论
姓名:       

《程序员app》专门为程序员量身定做!