Linux基础之文件目录

1 系统目录结构

1.1 系统目录介绍

Linux下一切皆文件,在Linux中是如何对不同的文件进行管理的,首先在Linux中将相同类型的文件存在指定的目录中,不同的发行商可能采用不同的标准去归类创建不同的目录,这样就会造成很多管理上的困扰。于是就有了所谓的Filesystem Hierarchy Standard(FHS)标准,其主要的目的是规范每个特定的目录下应该要存放什么文件。这样就能方便用户对文件进行管理。

Linux中的目录结构在逻辑上是以树状的形式存在的,可以通过以下明林查看根目录以及子目录:

[root@localhost ~]# tree -L 1 /
/
├── bin -> usr/bin
├── boot
├── dev
├── etc
├── home
├── lib -> usr/lib
├── lib64 -> usr/lib64
├── media
├── mnt
├── opt
├── proc
├── root
├── run
├── sbin -> usr/sbin
├── srv
├── sys
├── tmp
├── usr
└── var

19 directories, 0 files

1.2 Linux的目录结构

  • /bin: 用户命令存放的位置相当于Windows中的C:\Windows\system32
  • /sbin:系统管理使用的工具程序;

    注意:在Centos 7中/bin和/sbin两个目录是/usr/bin和/usr/sbin目录的软链接(Windows中的快捷方式)

  • /boot: 引导加载器必须用到的各种静态文件,主要有Kernel,initramfs(initrd),grub等;
  • /dev: 存储特殊文件或设备文件,设备有字符设备(线性设备)和 块设备(随机设备)两种类型;

    系统的磁盘文件存放在/dev目录下,比如/dev/sda3:

    • sd: 磁盘类型,特殊磁盘类型vd(KVM)
    • a: 磁盘排序,第一块磁盘为a,第二块磁盘为b,以此类推
    • 3: 代表一块磁盘的分区编号

      • 1-4: 表示主分区或扩展分区(前四个分区是并行存在,也就是说编号为1的分区 后可以为编号为3的分区)
      • 5- : 表示逻辑分区(逻辑分区的编号必须按照排序号进行)
  • /etc: 系统程序的配置文件,只能为静态文件;
  • /home: 普通用户的家目录集中位置。一般每个普通用户的家目录是此目录下与用户同名额子目录;
  • /root: 管理员的家目录;
  • /lib: 为系统启动或根文件系统上的应用程序(/bin,/sbin等)提供共享库,以及为内核提供内核模块;

    • libc.so.*: 动态链接的C库
    • ld*: 运行时链接器/加载器
    • modules: 用于存储内核模块的目录
  • /lib64: 64位系统特有的存放64位共享库的路径;

    注意:在Centos 7中/lib和/lib64两个目录是/usr/lib和/usr/lib64目录的软链接

  • /media: 便携式设备挂载点,一般cdrom、floppy、u盘等都是挂载在该目录下;
  • /mnt:其他文件系统的临时挂载点;
  • /opt:附加应用程序的安装位置,可选路径;
  • /srv: 当前主机为服务提供的数据,主机特有的;
  • /tmp:为那些会产生临时文件的程序提供的用于存储临时文件的目录,可提供所有用户执行写入操作,有特有权限;
  • /usr: 全局共享只读文件目录,重要性仅次于根目录;

    • ./bin, ./sbin, ./lib, ./lib64
    • ./include: C程序头文件
    • ./share: 命令手册页和自带文档等架构特有的文件存储位置
    • ./local: 另一个层级目录,让系统管理员安装本地应用程序,也通常用于安装第三方程 序
    • ./XllR64: X-Windows程序安装位置
    • ./src: 程序源码文件的存储位置
  • /var: 存储常发生变化的数据文件;
  • /proc:基于内存的虚拟文件系统,用于实现为内核及进程存储其他相关信息,它们多为内核参数,例如net.ipv4.ip_forward,虚拟为net/ipv4/ip_forward,存储在/proc/sys/目录下,因此其完整路径为/proc/sys/net/ipv4/ip_forward
  • /sys:sysfs文件系统的挂载点,为虚拟文件系统提供了一种比proc更为理想的访问内核数据的途径,主要作用于为管理Linux设备提供一种统一模型的接口。

2 文件路径定位

Linux系统的文件目录是以目录树的形式存储的,那么在Linux系统中我们如何能够找到一个文件所在的位置?联想现实生活中,我们要去某个地方去找某个人,首先必须先知道那个人在什么地方,然后依照路线去找到那个人。同样在Linux系统中要找到一个文件,首先要知道该文件大概在哪个目录下,然后通过路径去找到该文件。于是就有了相对路径和绝对路径:

2.1 相对路径

相对路径:根据当前环境

相对路径,关键点在于当前在什么路径下。假设当前目录在/usr/local下,那么它的上层目录(/usr目录);

2.2 绝对路径

绝对路径:唯一的路径

Linux系统采用了目录树的文件组织结构,在Linux下每个目录或文件都可以从根目录处开始寻找。比如/usr/bin目录,这种从根目录开始的全路径被称为"绝对路径",绝对路径一定是以"/"开头的,如何确认当前所在的目录,可以使用pwd命令查看:

[root@localhost ~]# pwd
/root

3 目录管理命令

对于目录的管理主要有,创建和删除目录,以及目录的移动或者重命名。这节主要看在Linux下如何创建和删除目录,下节结合文件的管理对目录的移动和重命名进行说明。在介绍创建和删除目录之前,先看一下两个命令:

3.1 ls命令

ls - list directory contents列出指定目录下的内容。

基本用法:

[root@localhost ~]# ls /
bin   dev  home  lib64  mnt  proc  run   srv  tmp  var
boot  etc  lib   media  opt  root  sbin  sys  usr

常用选项:

-a --all  列出所有文件,包括隐藏的文件
-l          以长格式的方式列出文件信息
-d        显示目录本身,不显示目录中的内容
-h        人性化显示,按照我们习惯的单位显示文件大小
-i        显示文件的i节点号

ls命令使用案例:

## 以长格式显示所有文件
[root@localhost ~]# ls -al

## 显示目录本身的信息
[root@localhost ~]# ls -ld /etc
drwxr-xr-x. 144 root root 8192 Feb 25 21:01 /etc

## -l选项以长格式显示文件信息
[root@localhost ~]# ls -l
total 8
. 1  root root 1257 Aug 28 00:13 anaconda-ks.cfg

ls -l用来显示文件详细信息,那么-l选项显示这7列分表代表什么:

  • 第一列:权限,-rw-r--r--

    • 第一个横杆代表文件的类型:
    • -: 代表普通文件
    • d: 代表目录
    • l: 表示链接文件
    • b: 表示块设备文件
    • c: 表示字符设备文件
    • s: 管道文件
    • rw-代表文件所属者的权限:

      • r: 写权限
      • w: 读权限
      • x: 执行权限
    • r--代表文件所属组的权限
    • r--代表文件其他用户的权限
  • 第二列:引用计数。文件的引用激素代表该文件的硬链接个数,而目录的引用计数代表该目录有多少个一级子目录。
  • 第三列:文件所有者 ,也就是这个文件属于哪个用户。默认所有者是问价的建立者。
  • 第四列:所属组。默认所属组是文件建立用户的有效组,一般情况下就是建立用户的所在组。
  • 第五列:文件大小。默认单位是字节。
  • 第六列:文件修改时间。文件状态修改时间或文件数据修改时间都会更改这个时间,注意这个时间不是文件的创建时间。
  • 第七列:文件名。

3.2 cd命令

change directorcd命令用于切换目录,也就是让当前用户切换到指定的目录下。

基本用法:

[root@localhost ~]# cd /etc
[root@localhost etc]# pwd
/etc

cd特殊用法:

[root@localhost ~]# cd -       #切换至上次所在目录
[root@localhost ~]# cd ~       # 切换至当前用户的家目录
[root@localhost ~]# cd         # 切换至当前用户的家目录
[root@localhost ~]# cd .       # .代表当前目录,一般在拷贝、移动文件等情况下使用
[root@localhost ~]# cd ..      # 切换至当前目录的上级目录

3.3 mkdir命令

make directory创建一个当前目录下不存在的目录

基本用法:

[root@localhost ~]# mkdir a

常用选项:

-p 递归创建目录,如果上级要创建目录的上级目录不存在则创建,如果不存在不报错
-v 显示创建目录详情

示例:

## 在/tmp/viktor目录下创建a_c、a_d、b_c、b_d目录:
[root@localhost ~]# mkdir -pv /tmp/viktor/{a,b}_{c,d} # 这块使用了命令行展开,之后说明

3.4 rmdir命令

rmdir - remove empty directories,删除空目录

基本用法:

[root@localhost ~]# rmdir -v a

如果该目录下有文件或者目录,rmdir命令就不能将该目录删除。

4 文件管理命令

Linux一切皆为文件,在对Linux进行配置时,很大程度上就是处理文件的过程,所以掌握文件的相关操作是非常有必要的文件的一般操作有:创建、复制、删除、移动、重命名、以及查看文件相关的信息。

4.1 touch命令

touch - change file timestamps,当文件不存在时创建文件,当文件存在时更新文件的时间戳信息。

[root@localhost ~]# touch /tmp/viktor_{1..10}.txt
[root@localhost ~]# touch filename
[root@localhost ~]# touch filename_1 filename_2
[root@localhost ~]# touch /home/server/file5 file5
[root@localhost ~]# touch file{1..10}
[root@localhost ~]# touch file{a..z}

4.2 stat命令

stat - display file or file system statusstat命令可以查看一个文件或者一个文件系统的相关的信息。

基本用法:

[root@localhost ~]# stat filename

4.3 cp命令

cp - copy files and directoriescp命令用来对文件或目录进行复制。

基本用法:

cp 源文件/目录 目标文件/目录

cp命令在复制文件或者目录的过程中,牵涉到用户所要复制的文件或者目录时一个还是多个,目标文件或者目录是否存在,存在以及不存在会是什么样的情况,下面分别来看下cp命令中的单源复制和多源复制时注意事项:

单源复制:

cp [OPTION]… [-T] SOURCE DEST
  • 情况1:如果目标不存在,则事先创建此文件,并复制源文件的内容至目标文件中;
  • 情况2:如果目标存在,并且是非目录文件,则覆盖目标文件;
  • 情况3:如果目标存在,并且是目录文件,则先在目标目录下创建一个与源文件同名的文件,并复制源文件的内容。

多源复制:

cp [OPTION]… SOURCE… DIRECTORY
cp [OPTION]… -t DIRECTORY SOURCE…
  • 情况1:如果目标不存在,报错;
  • 情况2:如果目标存在,并且是非目录,错误;
  • 情况3:如果目标存在,并且是目录,分别复制每个文件夹至目标目录中,并保持原名。

常用选项:

-i: 交互式复制,如果目标文件存在,提醒用户是否覆盖;
-f: 强制覆盖目标文件;
-r –R: 递归复制目录;
-d: 复制符号链接文件本身,而非其指向的源文件;
-a: -dR --preserve=all, archive,用于实现归档;
--preserve =
    mode: 权限
    ownership: 属主和属组
    timestamps: 时间戳
    context: 安全标签
    xattr: 扩展属性
    links: 符号链接
    all: 上述所有属性

4.4 rm命令

rm - remove files or directoriesrm命令用来删除指定的文件或目录。

基本用法:

rm [OPTION]… FILE...

常用选项:

-r: 递归删除(一般在删除目录时使用)
-f: 强制性删除,不提醒用户
-v: 删除时显示详细过程

4.5 mv命令

mv - move (rename) filesmv用来移动(重命名)文件或目录。

基本用法:

mv [OPTION]... [-T] SOURCE DEST

mv命令也牵扯到单源移动和多源移动:

单源移动:对于单源移动,分为目标是否为目录,以及目标文件是否存在。

  • 情况1:目标为目录, 此时会将源文件移动到指定的目录下
  • 情况2:目标为文件并该文件存在, 此时会提醒用户是否覆盖目标文件,使用-f选项可以强制移动;
  • 情况3:目标为文件并且该文件不存在,此时,如果目标不存在,就会创建相应的目标文件,然后将源文件移动至目标文件,相当于对源文件进行重命名;

多源移动:对于多源移动,目标必须为目录,否则会报错。

4.6 练习

## 在用户家目录下创建6个文件 song1.mp3 ~ song6.mp3
[root@localhost ~]# touch song{1,2,3,4,5,6}.mp3

## 把上述创建的songX.mp3文件移动到/Music目录(不存在则创建)
[root@localhost ~]# mkdir /Music
[root@localhost ~]# mv song* /Music/

## 在用户家目录下创建三个目录,分别为 friends, family, work
[root@localhost ~]# mkdir friends family work

## 切换到friends目录下,把/Music目录下的song1.mp3 ~ song6.mp3拷贝到当前目录
[root@localhost ~]# cd friends/
[root@localhost friends]# cp /Music/song* ./

## 切换到family目录下,把/Music目录下的song1.mp3 ~ song6.mp3移动到当前目录
[root@localhost ~]# cd family/
[root@localhost family]# mv /Music/song* ./

5 文件查看命令

Linux中有许多用来查看文件内容的命令,这些命令用在查看文件时的不同需求下,包括cat、more、less、head、tail命令,其中more和less命令属于分页显示文件的命令。

5.1 cat命令

cat - concatenate files and print on the standard outputcat命令用来读取文件的内容,一次性将文件读取到内存中,之后显示的终端屏上。只适用于读取小文件。该命令还有像文件中写入内容的功能。

基本用法:

cat [OPTION]... [FILE]...

常用选项:

-n: 显示行号
-A: 显示文件中的所有字符,包括回车符和TAB符   

特殊用法:

## 使用cat命令向指定的文件中写入内容:
[root@localhost ~]# cat >> a.txt <

5.2 more命令

more - file perusal filter for crt viewingmore命令用来分页显示文件内容,适用于读取大文件的内容。

基本用法:

[root@localhost ~]# more anaconda-ks.cfg

翻页翻行功能:

空格键翻页;回车键一次滚动一行

more命令的缺点在于,对于文件的内容只能向后查看。相对于more命令,less命令更加灵活。

5.3 less命令

less - opposite of moreless命令用来查看文件内容,相对于more命令,由于less命令能够反复的对文件内容进行查看,而被广泛利用,man手册中就使用的less命令来查看命令使用手册。

基本用法:

[root@localhost ~]# less anaconda-ks.cfg

翻屏:

空格键: 向文件尾翻一屏;
b: 向文件首部翻一屏;
Ctrl+d: 向文件尾部翻半屏;
Ctrl+u: 向文件首部翻半屏;
回车键: 向文件尾部翻一行;
k: 向文件首部翻一行;
G: 跳转至最后一行;
#G: 跳转至指定行;
lG: 跳转至文件首部;

文本搜索:

/keyword: 从文件首部向文件尾部依次查找;
?keyword: 从文件尾部向文件首部依次查找;
n: 与查找命令方向相同;
N: 与查找命令方向相反;

退出:

q: quit

5.4 head命令

有时候用户只需要查看文件的首部几行或者尾部几行,那么head和tail命令就能派上用场。

head - output the first part of files,显示指定文件的指定几行,默认显示文件的头10行。

基本用法:

 [root@localhost ~]# head /etc/passwd

常用选项:

-n: 指定显示文件头n行
[root@localhost ~]# head -n 3 /etc/passwd

5.5 tail命令

tail - output the last part of files,显示文件尾的任意行,默认显示倒数10行。

基本用法:

[root@localhost ~]# tail /etc/passwd

常用选项:

-n: 指定显示文件倒数n行
-f: 追踪显示文件末尾的内容(经常使用在对日志文件的监控)
[root@localhost ~]# tail -n 3 /etc/passwd
[root@localhost ~]# tail -n 3 -f /var/log/messages

6 文件下载命令

wget //文件下载
    -O //指定下载地址。更改名称
    -T //超时时间
    -q //安静下载(不显示wget输出)
    --spider //网络爬虫
    
curl //文件下载
curl –o http://www.baidu.com

yum install lrzsz
rz //文件上传
sz //文件下载
sz filename

7 命令查找命令

对于系统管理员来说,有时候需要在系统中查找一个文件,或者是查找一个命令以及该命令手册所在的位置,这样就能方便管理员的管理,那么在文件和命令的查找所用的命令有locate, which, whereis, find(后面详解),下面分别介绍这些命令的用法:

7.1 locate命令

locate - find files by namelocate命令通过文件名来查找文件。

基本用法:

[root@localhost ~]# locate /etc/p

locate命令会查找指定目录下包含给出字符串开头的所有文件。locate /etc/p就会查找/etc目录下以p开头的所有文件。

常用选项:

-i: 查找时忽略大小写

该命令的优点在于查找速度快,因为其存在一个数据库,每次查找命令在这个数据库中查找。但是,该命令查找不是实时查找,如果有一个新文件,但是数据库没有更新,那么通过locate命令就查找不到,这也是其缺点所在,通过updatedb命令更新locate数据库。find命令可以实时查询文件,但是在查找的效率上比不上locate命令。

7.2 which命令

which - shows the full path of (shell) commandswhich命令会显示当前shell下命令二进制文件所存的路径。只能查找系统PATH变量中所包含的目录下的命令(绝对路径)。

基本用法:

[root@localhost ~]# which locate

7.3 whereis命令

whereis - locate the binary, source, and manual page files for a commandwhereis命令显示定位某个命令的二进制文件、源码以及该命令手册文件的路径。非PATH变量查找,所以查找的范围比which要广。

基本用法:

[root@localhost ~]# whereis ls

常用选项:

-b   仅查找二进制文件
-m   仅查找命令手册文件
-s   仅查找源文件

8 字符处理命令

​ 对文本文件进行处理时,有时候需要对文件中的一些字符进行处理,比如说按照某个字段对文件中内容进行排序、或者是统计文件中内容重复的行数等操作,那么和这些操作相关的命令就是字符处理命令。

8.1 sort命令

sort - sort lines of text files,对文本文件中的每一行进行排序。

基本用法:

[root@localhost ~]# sort /etc/passwd

不加任何选项的sort命令,默认以文件中的第一个字段以及空格为分隔符进行排序。

常用选项:

-r: 倒序
-n: 按数字排序
-t: 指定分隔符(默认为空格)
-k: 指定第几列,指定第几列第几个字符(指定1,1 3.1,3.3)

sort的用法示例1:

  • 首先创建一个文件
[root@localhost ~]# cat >> sort.txt < b:3
> c:2
> a:4
> e:5
> d:1
> f:11
> EOF
  • 对sort.txt文件进行排序
[root@localhost ~]# sort sort.txt  ## sort默认从小到大排序。
a:4
b:3
c:2
d:1
e:5
f:11  
  • 按照数字对sort.txt文件中的行进行排序
[root@localhost ~]# sort -t ":" -k2 sort.txt
d:1
f:11
c:2
b:3
a:4
e:5

看到输出的内容,可能有一个疑问,为什么第二行的是11,这一行不应该是排在最后一行的吗?上面使用的命令只会看到第一个字符,11的第一个字符是1,按照字符的排序确实比2小。如果想要按照数字的形式进行排序,需要使用-n选项。

[root@localhost ~]# sort -t ":" -n -k2 sort.txt
d:1
c:2
b:3
a:4
e:5
f:11

## 按照第二列的数字对sort.txt文件进行逆序排序。
[root@localhost ~]# sort -t: -k2nr sort.txt
f:11
e:5
a:4
b:3
c:2
d:1

sort用法示例2:

  • 创建如下文件:
[root@localhost ~]# cat >> test.txt < 192.168.3.1
> 192.168.3.2
> 192.168.3.3
> 192.168.2.20
> 192.168.2.21
> 192.168.2.22
> 192.168.0.151
> 192.168.0.152
> 192.168.0.153
> 192.168.1.10
> 192.168.1.11
> 192.168.1.12
> 192.168.1.1
> 192.168.2.2
> 192.168.3.3
> 192.168.2.20
> 192.168.1.21
> 192.168.2.22
> 192.168.0.151
> 192.168.1.152
> 192.168.0.153
> 192.168.3.10
> 192.168.1.11
> 192.168.3.12
> EOF
  • 针对第三列的第一个字符,第四列的第一个字符到第三个字符排序
[root@localhost ~]# sort -t. -k3.1,3.1n -k4.1,4.3n test.txt
192.168.0.151
192.168.0.151
192.168.0.152
192.168.0.153
192.168.0.153
192.168.1.1
192.168.1.10
192.168.1.11
192.168.1.11
192.168.1.12
192.168.1.21
192.168.1.152
192.168.2.2
192.168.2.20
192.168.2.20
192.168.2.21
192.168.2.22
192.168.2.22
192.168.3.1
192.168.3.2
192.168.3.3
192.168.3.3
192.168.3.10
192.168.3.12

8.2 uniq命令

uniq - report or omit repeated lines,如果文件中有多行完全相同的内容,当然是希望能删除重复的行,同时还可以统计出完全相同的行出现的总次数,那么就可以使用uniq命令解决这个文件(但是必须配合sort命令使用)。

基本用法:

[root@localhost ~]# cat uniq.txt | sort | uniq

uniq命令需要结合sort命令一起使用,先使用sort进行排序,让文中重复的内容连续出现在一起,然后再去重。

常用选项:

-c: 计算重复的行出现的次数
[root@localhost ~]# cat uniq.txt | sort | uniq -c

8.3 cut命令

cut - remove sections from each line of filescut命令用来截取文件中每一行的指定字段。

常用选项:

-d: 指定分隔符
-f: 数字,取第几列,比如-f3,6 取第三列和第六列
-c: 按字符取(空格也算)

cut命令使用案例:

## 过滤出文件里server以及552408925。
[root@localhost ~]# cut -d" " -f2,6 server.com

你可能感兴趣的:(linux)