Linux 的哲学思想之一,一切皆文件,所以我们学习 Linux 处处要与文件目录打交道,熟悉它们是我们学好 Linux 的基本前提。

    用户跟计算交互,是通过接口来实现的。而交互接口又分为两种:GUI 图形接口 和 CLI 命令行接口(在 Linux 默认是 Bash shell)。而我们 Linux 做为服务器,一般不会启用图形接口,因为从占用计算机资源,安全稳定等方面的考虑。所以,我们就不能像操作 windows 那样通过鼠标点击来完成跟计算机的交互的。我们系统提供了很多命令,每个命令可以完成相应的功能,如:文件目录查看、创建、移动、删除、重命名。其实,GUI 是把这些命令进行了包装而以。在 Linux 环境下,我们可以在命令提示符下 [root@Node1 ~]# 键入 command 来完成某项功能。我们使用的 CLI 是 Bash shell.

一、文件的管理

    Linux 其中有一个重要的哲学思想,一切皆文件。所以,我们学会Linux 文件的管理,是管理好 Linux 系统的最起码的前提。Windows系统中,区别不同格式的文件依据是文件的后缀名,而 Linux 中截然不同的。

     文件的操作包括:创建文件、编辑修改文件、移动文件、删除文件、文件的重命名等一系列操作。在 Linux 系统中目录也是文件中的一种,我们称之为目录文件。所以,目录的管理与文件的管理有很多相似之处。

1、编辑文件

    编辑文件,就要使用到相应的应用程序(文件编辑器),大家都知道不同的文档编辑器支持的文件格式不尽相同。我们只有知道文件的格式了,才能使用支持该格式的编译器打开被编辑的文件再进行编辑操作。如果,我们使用不支持二进制格式的编辑器,打开二进制文档就会出现乱码,严重的话,还会损坏文件,这是非常严重的。

 我们怎样根据文件格式,选择编辑文件的应用程序呢?

 (1)、对于命令类文件,我们要先使用【which】获知 command 在哪里,再查看文件的类型

[root@Node1 ~]# which httpd
/usr/sbin/httpd

 (2)、使用【file】查看文件的格式

[root@Node1 ~]# file /usr/sbin/httpd
/usr/sbin/httpd: ELF 32-bit LSB shared object, Intel 80386, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.18, stripped

(3)、分析文件格式,选择文件编辑器打开文件进行相应操作

   通过第二步,使用【file】可以获取一个文件的格式,再根据文件格式选择相应的编辑器打开该文件

   使用【file】查看 /usr/sbin/httpd 得知,该文件是 ELF 格式的二进制文件。我们不能使用文本编    辑器查看该文件的。

   ELF 格式是 Linux 现在采用的执行文件的标准格式。不同操作系统所使用的执行文件的格式是不同    的。所以在 Linux 编译的程序移植到 windows 一般是无法运行的。

   ELF 格式的二进制执行文件是经过一系统过程:

   对程序的源文件做预处理(cpp) ----> 汇编 ----> 链接 ---> 可执行文件。 在 Linux 中编译源程     序,是由 GCC 调用它们来完成

   源程序的编译操作的。

(4)、Linux 中常用的文件编辑器

     vi      文本编辑器
     nano    文本编辑器

2、常见的对文件的操作如:创建、复制、移动和删除。

   数据的覆盖(overwrite)、删除都会对数据造成丢失,平时我们在 windows 下复制文件时,如果目标文件已经存在,它都会友好地提示,是否覆盖目录文件。我们的 Linux 也有这样的功能。使用命令: mv、cp、rm 对文件进行操作时,有时会对文件数据进行损坏(覆盖、删除),当使用这些命令操作文件时,对数据造成损坏时,会进入交互模式(询问用户是否进行该操作),用户是否进行该操作。使用该方式可以在一定范围内避免了,用户误操作造成数据的损坏。mv 、cp、rm 命令都有 -i 选项,该选项是启用交互模式的。如果用户确定知道该目录中的所有文件内容都可以删除的,这些命令也提供了 -f 选项,强制进行该操作,不进入交互模式,该选项,对于一下子删除多个文件是很有方便的,但有风险。

[root@node2 mytest4]# mv ../mytest3/inittab /tmp/mytest4/
mv: overwrite `/tmp/mytest4/inittab'? y      
                       ---------> 交互模式,询问用户是否覆盖 /tmp/mytest4/inittab 文件。

对文件的操作常用到的命令如下所述:

   touch      新建空文件
   vi         使用 vi 编辑器打开不存在的文件也会新建文件的
   mv         移动/重命令文件
   cp         复制/重命名文件
   rm         删除文件

(1)创建:

       创建空文件可以使用【touch】或 使用 vi 编辑器。


(2)复制:

      【cp】命令的使用格式

   cp   [OPTION]... SOURCE... DIRECTORY
   命令   选项       源         目标


   【cp】 命令有一个很有意思有选项,可以比较源文件与目标文件相比是否发生改变,改变就复制。 

    常用于备份。

    复制操作,如何使用的思考?

    对于文件的复制操作,我们要分析源(复制源),目标(使用cp 复制数据到哪里去)和复制数据的要求。

   源分为文件和目录

   复制,我们要分析,源是文件还是目录且目录中是否有子目录?

   如果我们对目录(源)进行复制操作,如果目录中还有子目录,子目录中还有文件,我们要使用递归复制操作。 cp 的 -r|R 选项.

既然源是目录了,目标就不可能是一个文件。再分析,复制要求,下面对各种要求进行复制分析:

     A)、如果,保留源的属主、属组等属性,要使用 -a 选项(常用于备份)或 -P ,但是它们有区别。

     B)、如果,不修改被复制的目录名称,我们在复制前,要把目标目录创建好。

     C)、如果,只复制源目录中的数据文件和目录文件,不复制源(目录)。复制操作前不要创建目标(目录)


例子:

   复制要求:

          复制目录中的文件并重命名源目录名称

   把目录中的所有文件,都复制到另个一个目录(目标目录不存在,就创建目录),如果目录(目标存在)则把源目录及目录中内容一并复制到目录目录中

   A)、目标目录存在的情况下

[root@Node1 ~]# mkdir /home/user
[root@Node1 ~]# ll /home/ | grep user
drwxr-xr-x. 2 root     root   4096 Jul  4 19:33 user
[root@Node1 ~]# cp -a /etc/skel/ /home/user/
[root@Node1 ~]# tree -a /home/user/
/home/user/
└── skel
    ├── .bash_logout
    ├── .bash_profile
    ├── .bashrc
    ├── .gnome2
    └── .mozilla
        ├── extensions
        └── plugins

5 directories, 3 files

  B)、目标目录不存在的情况下

[root@Node1 ~]# rm -rf /home/user
[root@Node1 ~]# ll /home/ | grep user
[root@Node1 ~]# cp -a /etc/skel/ /home/user
[root@Node1 ~]# tree -a /home/user/
/home/user/
├── .bash_logout
├── .bash_profile
├── .bashrc
├── .gnome2
└── .mozilla
    ├── extensions
    └── plugins

4 directories, 3 files

源为单个文件的情况分析:

    如果源是文件,目标可以是文件或目录。分析复制要求。

    A)、复制结果要求:复制并重命名文件,则做文件的复制操作前,目标一定不是存在。

    B)、复机结果要求:复制并覆盖目标文件,则做文件的复制操作之前,目标文件一定是存在。

    C)、复制结果要求:复制文件到一个指定目录下,如果目标目录不存在,则显示错误。

        cp 复制文件时是不帮助创建目录的(复制目录时,如果目标目录不存在帮助创建目录)。所以我         们要先创建目标目录

[root@node2 ~]# cp /etc/inittab /tmp/mytest3/
cp: cannot create regular file `/tmp/mytest3/': Is a directory
[root@node2 ~]# mkdir /tmp/mytest3
[root@node2 ~]# cp /etc/inittab /tmp/mytest3/
[root@node2 ~]# echo $?
0

源为多个文件,目标必须是目录。要先创建目标。

[root@node2 ~]# cp /etc/inittab  /etc/fstab  /tmp/mytest4
cp: target `/tmp/mytest4' is not a directory
[root@node2 ~]# cp /etc/inittab  /etc/fstab  /tmp/mytest4/
cp: target `/tmp/mytest4/' is not a directory
[root@node2 ~]# mkdir /tmp/mytest4
[root@node2 ~]# cp /etc/inittab  /etc/fstab  /tmp/mytest4/
[root@node2 ~]# echo $?
0

(3)移动:

     【mv】move (rename) files 移动或重命名。类似于 windows 中剪切操作。它是会删除源的,如果源是目录且目录中有子目录,不需要使用递归。也会把目录中所有的数据 move 掉。


分析各种移动源,的要求:

      A)、如果要求,移动并重命名源(不管源是目录还是文件),使用【mv】操作文件/目录前,目标是           不可能存在的。

      B)、如果源是目录,移动结果要求对源进行重命名操作,使用【mv】操作之前,目标是不可以存           在的。该命令会帮助创建目标目录的。

      C)、如果源是目录,移动结果要求把源移动到另外一个目录中,不需要对源重命名,则使【mv】           操作之前,目标目录一定是存在的。如下例子。

[root@node2 mytest4]# mkdir ../mytest7
[root@node2 mytest4]# mv ../mytest3  ../mytest7/
[root@node2 mytest4]# ll /tmp/mytest7/
total 8
drwxr-xr-x 2 root root 4096 Jul  5 07:28 mytest3

(4)删除:

【rmdir】Remove the DIRECTORY(ies), if they are empty. 只能移除空目录。

【rm】remove files or directories 删除文件或目录。

【rm】命令的使用格式:

 rm -r|-R director  递归强制删除目录中的内容
 rm -r|-R director  交互式删除目录中的内容,所以 -r 或 -R 选项常用于删除目录中的内容。
 rm -i|-f file      交互式删除文件或强制删除文件

注意:

    该命令默认选项是不会删除根目录(/)的。

3、应用程序,可以往一个文件中写数据,说明该用户具有该文件的写(w)权限。应用程序可以读该文件,说明该用户具有该文件的读(r)权限。该文件可以被内核加载到内存中,并以某一用户的身份在CPU上运行起来,说明该用户具有该文件的执行权限。而 linux 是多用户多任务的操作系统,文件目录还具有属主、属组属性。 用户具有读(r)权限,才可以使用【ls】命令 列出该目录的文件名列表。

[admin@Node1 home]$ ll | grep system
drwx------. 4 system   system 4096 Jul  4 16:39 system
[admin@Node1 home]$ ll ./system/
ls: cannot open directory ./system/: Permission denied

说明:

    /home/system/ 目录的权限是 700, 属组、基它用户使用 ls 命令是不可以列出该目录的文件名列表的。


   那么怎么查看文件这些属性呢?

   使用【ls】命令来实现

[root@Node1 ~]# ll -h /root/
total 72K
-rw-r--r--. 1 root root  551 Jul  3 17:28 5.1.txt
-rw-------. 1 root root 2.1K Jun 30 11:56 anaconda-ks.cfg
-rw-r--r--. 1 root root   17 Jul  3 17:08 head
-rw-r--r--. 1 root root  42K Jun 30 11:56 install.log
-rw-r--r--. 1 root root 9.8K Jun 30 11:54 install.log.syslog
-rw-r--r--. 1 root root    0 Jul  3 17:26 tr

-h  像 windows 中,查看详细信息。

-S  显示的文件按文件大小排列,一般这样使用【ll -hS】

[root@node2 ~]# ll -Sh /etc/
total 3.3M
-rw-r--r--  1 root   root   789K Jan  7  2007 termcap
-rw-r--r--  1 root   root   354K Feb 23  2006 services
-rw-r--r--  1 root   root   136K Jul  1 21:38 prelink.cache
-rw-r--r--  1 root   root    91K Jun  4  2007 Muttrc

显示 /etc 中以 p 打头的文件(目录也是文件,称为目录文件),使用 -d  参数不显示目录中的内容,注意使用“通配”的时候才使用,【ll】会显示匹配到的目录中的所有内容,如不想显示,可以使用 -d 选项。

[root@node2 ~]# ll /etc/p*
-rw-r--r-- 1 root root     12 Jan  6  2007 /etc/pam_smb.conf
-rw-r--r-- 1 root root   1623 Jun 22 15:25 /etc/passwd
/etc/pam.d:
total 336
-rw-r----- 1 root daemon 390 Jan 27  2010 atd
-rw-r--r-- 1 root root    97 Sep 27  2009 authconfig
-rw-r--r-- 1 root root    97 Sep 27  2009 authconfig-tui
...
/etc/pango:
total 24
drwxr-xr-x 2 root root  4096 Apr  5 00:13 i686-redhat-linux-gnu
-rw-r--r-- 1 root root 11446 Sep  3  2009 pangox.aliases
...

[root@node2 ~]# ll -d /etc/p*
drwxr-xr-x 2 root root   4096 Apr  5 00:15 /etc/pam.d
drwxr-xr-x 2 root root   4096 Apr  5 00:13 /etc/pam_pkcs11
-rw-r--r-- 1 root root     12 Jan  6  2007 /etc/pam_smb.conf
drwxr-xr-x 3 root root   4096 Apr  5 00:13 /etc/pango
-rw-r--r-- 1 root root   1623 Jun 22 15:25 /etc/passwd

二、目录的管理:

1、创建目录

   使用【mkdir】

   该命令结合 Bash shell 的“命令行展开特性{}”可以创建分层的目录。我们从零构建Linux 系统(LFS)时,要创建很多目录,该种方式无疑是最好的选择。

[root@Node1 ~]# mkdir  -pv /tmp/test_mkdir/{boot,root,etc,bin,sbin,lib,var,tmp,usr/{bin,etc,include,lib,local,sbin,share,share,src}}
mkdir: created directory `/tmp/test_mkdir'
mkdir: created directory `/tmp/test_mkdir/boot'
mkdir: created directory `/tmp/test_mkdir/root'
mkdir: created directory `/tmp/test_mkdir/etc'
mkdir: created directory `/tmp/test_mkdir/bin'
mkdir: created directory `/tmp/test_mkdir/sbin'
mkdir: created directory `/tmp/test_mkdir/lib'
mkdir: created directory `/tmp/test_mkdir/var'
mkdir: created directory `/tmp/test_mkdir/tmp'
mkdir: created directory `/tmp/test_mkdir/usr'
mkdir: created directory `/tmp/test_mkdir/usr/bin'
mkdir: created directory `/tmp/test_mkdir/usr/etc'
mkdir: created directory `/tmp/test_mkdir/usr/include'
mkdir: created directory `/tmp/test_mkdir/usr/lib'
mkdir: created directory `/tmp/test_mkdir/usr/local'
mkdir: created directory `/tmp/test_mkdir/usr/sbin'
mkdir: created directory `/tmp/test_mkdir/usr/share'
mkdir: created directory `/tmp/test_mkdir/usr/src'
[root@Node1 ~]# tree /tmp/test_mkdir/
/tmp/test_mkdir/
├── bin
├── boot
├── etc
├── lib
├── root
├── sbin
├── tmp
├── usr
│   ├── bin
│   ├── etc
│   ├── include
│   ├── lib
│   ├── local
│   ├── sbin
│   ├── share
│   └── src
└── var

2、删除目录

   【rmdir】Remove the DIRECTORY(ies), if they are empty. 只能移除空目录。