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. 只能移除空目录。