Linux 命令行大全

shell 是什么

当谈到命令行时,我们实际上指的是 shellshell 是一个接受由键盘输入的命令,并将其传递给操作系统来执行的程序。

当使用图形用户界面时,需要另一种叫终端访问器的程序与 shell 进行交互。

如果 shell 提示符的最后一个字符是 # ,而不是 $ ,那么终端会话将享有超级用户特权。这就疑问这要么我们是以根用户身份登录,要么我们选择的总段仿真器可以提供超级用户特权。

  • 如果紧按鼠标左键选中一些文本并拖动鼠标(或双击选中一个词),按下鼠标的中间按键可以将选中的文本粘贴到光标所在的位置。
  • date 显示时间。
  • cal 显示日历
  • df 查看磁盘驱动器当前的可用空间
  • free 显示可用内存
  • exit 结束终端会话

导航

我们首先需要学习的是如何在 Linux 系统中导航文件系统

理解文件系统树

UNIX 操作系统也是以称之为分层目录结构的方式来组织文件的。这意味着文件是在树形结构的目录中进行组织的。文件系统的第一个目录叫做根目录,它包含了文件和子目录。子目录包含了更多的文件和子目录。在类 UNIX 文件系统中,无论多少驱动器或存储设备与计算器相连,通常只有一个文件系统树。

用户所处的目录叫做当前工作目录。使用 pwd (打印工作目录)命令可以显示当前工作目录。第一次登陆系统时,当前工作目录被设置成主目录。

  • ls可以列出当前工作目录的文件和目录。
  • cd命令可以改变工作目录:只需输入cd命令,然后再输入目标工作目录的路径名即可。
  • .表示工作目录。
  • ..表示工作目录的父目录。
  • cd将工作目录改为主目录
  • cd-将工作目录改为先前的工作目录。
  • cd-username将工作目录改为username的主目录。例如,cd~bob将目录改为用户bob的主目录。
  • . 开头的文件名是隐藏的。这仅说明 ls 不会列出这些文件,除非输入 ls-a
  • UNIX 一样,在 Linux 中,文件名与命令是区分大小写的。
  • 与其他一些操作系统一样, Linux 没有文件扩展名的改变。我们可以按照自己的喜好随意给文件命名,尽管类 UNIX 操作系统不使用文件扩展名来决定文件内容或用途,但一些应用程序却这么做了。
  • Linux 支持长文件名,文件名包含了嵌入的空格和标点符号。但是在创建文件名的过程中,仅句号、连字符和下划线是可以使用的。文件名中不要嵌入空格。

Linux 系统

  • ls /a /user可以查看多个目录下的内容。
  • ls -l可以将输入以长格式显示。

选项和参数

下面,让我们了解一下大部分命令是如何工作的。通常,命令后面会有一个或多个选项,带有不同选项的命令其功能也不一样。此外,命令后面还会跟有一个或多个参数,这些参数是命令作用的对象,所以大部分命令看起来如下所示: command -option arguments

大部分命令是在单个字符前加上连字符,如 -l ,但是很多命令也支持在单字前加两个连字符的长选项。而且,很多命令也允许多个短选项串在一起使用。在下面的例子中, ls 命令包含了两个选项, l 选项产生长格式的输出,而 t 选项表示以文件修改时间的先后将结果进行排序

ls -lt

加上长选项 - -reverse ,则结果会以相反的顺序输出。 ls 常用选项如下

-a --all 列出所有文件,包括以点号开头的文件

-d --directory 可查看目录的详细信息

-F --classify 选项会在每个所列出的名字后面加上类型指示符(例如,如果名字是目录名,则会加上一个斜杠)

-h --human-readable 以长格式列出,以人们可读的方式而不是字节数来显示文件大小,使用长格式显示结果。

-l 使用长格式显示结果。

-r --reverse 相反的顺序显示结果。

-S 按文件大小对结果排序。

-t 按修改时间排序。

-l 命令使得 ls 命令以长格式显示其结果。这种格式 包含大量信息。

**less 和 file **

file 命令可以确定文件类型,打印出文件内容的简短说明。事实上,在类 UNIX 系统中,有个普遍的观念是“所有东西都是一个文件”。

less 命令是一种查看文本文件的程序。很多文件都含有人们可以阅读的文本。 less 程序为我们查看文件提供了方便。

有很多方式可以在计算机中表达信息。所有的方式都涉及在信息与一些数字之间确立一种关系,而这些数字可以用来表达关系。

有些表示方法比较复杂,有些简单,其中最早也是最简单的是 ASCII 文本。文本是字符与数字之间的简单的一对一映射,这与文字处理器文档中的文本是不一样的,比如 word

less 命令的使用方式如下

less filename

一旦运行起来, less 程序允许我们前后滚动文件。比如想要查看定义了系统用户账户的文件,可输入下列命令

less /etc/passwd

一旦 less 程序运行起来,我们就可以查看文件内容。如果文件不知一夜,可以上下滚动文件。按 Q 键可以推出 less 程序。

G 跳转到文本文件的末尾

1G 或 g 跳转到文本文件的开头

n 向前寻找下一个出现的字符串,这个字符串是之前所指定查找的

h 显示帮助屏幕

q 退出 less

快速浏览

当我们浏览文件系统时,不要担心将文件系统的布局弄得混乱不堪。普通用户不再具有管理文件系统的权限,那是系统管理员的工作。如果一条命令无法执行某些功能,那么继续选择其他命令。下面是一些探索到的目录。

/ 根目录

/ bin 包含系统启动和运行所必须的二进制文件,包含 Linux 内核、最初的 RAM 磁盘映像(系统启动时,驱动程序会用到),以及自动加载程序

/ boot 有趣的文件:1. /boot/grub/grub.conf 或 menu.lst,用来配置启动加载程序。2. /boot/vmlinuz, Linux 内核

/ dev 这是一个包含设备节点的特殊目录。“把一切当成文件”也适用于设备。内核将它能够识别的所有设备存放在这个目录里。

/ etc 包含了所有系统层面的配置文件,同时也包含了一系列 shell 脚本,系统每次启动时,这些 shell 脚本都会打开每个系统服务。该目录中包含的内容都应该是可读的文本文件

/ home 在通常的配置中,每个用户搜会在 /home 目录中拥有一个属于自己的目录。普通用户只能在自己的主目录中创建文件

/ lib 包含核心系统程序使用的共享库文件。这与 Windows 系统中的 DLL 类似

/ lost + found 每个 Linux 文件系统的格式化分区或设备,例如 ext3 文件系统,都会有这个目录,当文件系统崩溃时,该目录用于恢复分区。

/ media 在现代 Linux 系统中,/media 目录包含可移除媒体设备的挂载点,比如 USB 驱动、CD-ROM 等。这些设备在插入计算机后,会自动挂载到这个目录节点下。

/mnt 在早期的 Linux 系统中, /mnt 目录包含手动挂载的可移除设备的挂接点。

/opt /opt 目录用来安装其他可选的软件。主要用来可能安装在系统中的商业软件。

/proc 它不是存储在硬盘中的真正的文件系统,而是一个 Linux 内核维护的虚拟文件系统。它包含的文件是内核的窥视孔。该文件是可读的,从中可以看到内核是如何监管计算机的。

/root root 账户的主目录

/sbin 该目录放置系统二进制文件。这些系统执行重要的系统任务,这些人物通常是为超级用户预留的。

/tmp 供用户存放各类程序创建的临时文件的目录,某系配置使得每次系统重启时都会清空该目录。

/ usr 可能是 Linux 系统中的最大目录树。它包含普通用户使用的所有程序和相关文件。

/usr/bin 放置了一些 Linux 发行版安装的可执行文件。该目录通常会存储成千上万个程序。

/usr/local 这个目录并非是系统发行版自带,但却打算让系统使用的程序的安装目录,有源代码编译好的程序通常安装在 /usr/local/bin 中,只有系统管理员向其中添加内容。

/usr/sbin 包含更多的系统管理程序。

/usr/share 包含了 /usr/bin 中程序所使用的所有全部共享数据。这包括默认配置文件、图标、屏幕背景、音频文件等。

/usr/share/doc 安装在系统中大部分程序包包含一些文档文件。文档文件是按软件包来组织分类的

/var 除了/tmp 和 /home 目录之外,目前看到的目录相对来说都是静态的。而那些可能改变的数据存储在 /var 目录树里。各种数据库、假脱机文件、用户邮件等都存储在这里。

/var/log 此目录包含的日志文件记录了各种系统活动,在一些系统里,必须是超级用户才能查看日志文件。

符号链接

假如说有个文件版本会更新版本,我们可以为它创建一个符号链接,而如果文件版本更新,新版本有程序错误,只需删除新版本的符号链接,重新创建指向旧版本的符号链接即可。

操作文件与目录

坦率地讲,使用图形文件管理器来执行一些文件操作会容易得多,那为什恶魔要使用这些命令行操作呢?

原因就在于命令行程序就有强大的功能和灵活的操作。虽然对于图形文件管理器可以轻松实现简单的文件操作,但对于复杂的任务,使用命令行程序更容易完成。

通配符

由于 shell 需要经常使用文件名,因此它提供了一些特殊字符来帮助你快速指定一组文件名。这些特殊字符成为通配符。通配符允许用户一句字符模式选择文件名。

通配符

* 匹配任意多个字符

? 匹配任意单个字符

[characters] 匹配任一属于字符集中的字符

[!characters] 匹配任一不属于字符集中的字符

[[:class:]] 匹配任一属于指定字符类中的字符

常用字符类

[:alnum:] 任一字母或数字

[:alpha:] 任一字母

[:digit] 任一数字

[:lower:] 任一小写字母

[:up[per:] 任一大写字母

通配符的使用使得为文件名构建复杂的筛选标准成为可能。下面列出一些通配符模式及其匹配内容的示例

  • * 所有文件
  • g* 以 g 开头任一文件
  • b*.txt 以 b 开头,中间有任意多个字符,并以.txt结尾的任一文件
  • Data???Data开头,后面跟3个字符的任一文件
  • [abc]*abc中的任一开头的任一文件
  • BACKUP.[0-9][0-9][0-9]BACKUP开头,后面紧跟3个数字的任一文件
  • [[:upper:]]*以大写字母开头的任一文件
  • [![:digit:]]*不以数字开头的任一文件
  • [[:lower:]123]以小写字母或数字1、2、3中的任一结尾的任一文件

我们最好使用字符类来进行筛选,以 [A-Z][a-z] 形式的字符范围表示法可能会产生非预期的结果

  • mkdir dir1可创建单个目录,mkdir dir1 dir2 dir3可创建多个目录

  • cp item1 item2复制单个文件或目录,cp item... directory复制多个文件或目录进一个目录中

    • -a, --archive复制文件和目录及其属性,包括所有权和权限
    • -i --interactive在覆盖一个已存在文件前,提示用户进行确认。如果没有指定该选项,cp会默认覆盖文件
    • -r --recursive递归地复制目录及其内容,复制目录时需要这个选项
    • -u --update将文件从一个目录复制进另一个目录时,只会复制那些目标目录中不存在的文件或是目标目录相应文件的更新文件。
    • -v --verbose复制文件时,显示信息性消息
    • cp file1 file2如果file2存在,则会被file1内容覆盖,如果file2不存在,则创建file2
    • cp -i file1 file2同上,区别在于会通知用户确认
    • cp file1 file2 dir1file1file2复制到目录dir1里。dir1已存在。
    • cp -r dir1 dir2dir1的内容复制进dir2,如果dir2不存在,则创建dir2
  • mv命令与cp命令基本相似,它可以执行文件移动和文件重命名操作。mv item1 item2mv item... directorymv命令的很多选项与cp命令是共享的,具体参考cp

  • rm用来移除文件和目录,rm item...其中item是一个或多个文件(或目录)的名称。

    类 UNIX 操作系统并不包含还原删除操作的命令,一旦使用 rm 命令,就彻底删除了。rm 命令与通配符在一起要特别小心,可以先用 ls 命令预先对通配符进行测试,浙江显示预删除的文件。

    • -i --interactive在删除一个已存在文件前,提示用户进行确认。如果没有指定该选项,cp会默认覆盖文件
    • -r --recursive递归地删除目录及其内容,复制目录时需要这个选项
    • -f --force忽略不存在的文件并无需提示确认。该选项会覆盖--interactive选项
    • -v --verbose删除文件时显示信息性消息
    • rm -rffile1dir1不存在时,rm仍会继续执行,且不提示用户
  • ln命令可用来创建硬链接或是符号链接。它的符号有两种,ln file link用来创建硬链接,ln -s item link用来创建符号链接,这里的item可以是文件也可以是目录

硬链接

硬链接是最初 UNIX 来创建连接到方式,符号链接较之更为先进。默认情况下,每个文件有一个硬链接,该硬链接会给文件起名字。当创建一个硬链接的时候,也为这个文件创建了一个额外的目录条目。硬链接有两条重要的局限性。

  • 硬链接不能引用自身文件系统之外的文件。也就是说,连接不能引用与该链接不在同一磁盘分区的文件。
  • 硬链接无法引用目录

硬链接与文件本身没有什么不同,删除了这个链接,这个文件依旧存在(也就是说,该空间没有释放),除非该文件的所有链接都被删除了。

可以想象文件是由两部分组成的,包含文件内容的数据部分和包含文件名的名称部分。创建硬链接时,实际上是创建了额外的名称,这些名称都指向同一数据部分。

ls -li 中的 -i 可以显示硬链接和文件开头具有相同的索引号。

符号链接

符号链接是为了克服硬链接的局限性而创建的。符号链接是通过创建一个特殊类型的文件来起作用的,该文件包含了指向引用文件或目录的文本指针,就这点来看,符号链接与 Windows 系统下的快捷方式非常相似。

符号链接指向的文件与符号链接自身几乎没有区别。例如,将一些东西写进符号链接里,那么这些东西同样也写进了引用文件。当删除一个符号链接时,删除的知是符号链接而没有删除文件本身,如果先删除文件,那么这个链接就成为坏链接。在在很多实现命令中, ls 命令会用不同颜色来显示坏链接,比如红色。

创建符号链接时,同时也创建一个文本来描述目标文件在哪里与符号链接有关联。

ln -s ../fun dir1/fun-sym 其中前一个是表示相对于软链接的路径,第二个是表示软链接放在哪。

创建符号链接时,也可以使用绝对路径名。同时也可以引用目录。

命令的使用

一条命令无外乎以下4种情况。

  • 可执行程序。可执行程序就像在/usr/bin目录里看到的所有文件一样。在程序类别中,程序可以编译为二进制文件,比如 C,C++ 语言编写的程序,也可以是 shell、Perl、Python、Ruby等脚本语言编写的程序。
  • shell 内置命令。bash支持许多在内部称之为shell builtin的内置命令。例如cd命令就是shell内置命令指令。
  • shell 函数。shell函数是合并到环境变量中的小型shell脚本。
  • alias 命令。我们可以在其他命令的基础上定义自己的命令。

能够准确地识别我们使用的命令是上面的哪一种是很有用的,Linux 提供了两个方法来识别命令类型。

  • type命令是一个shell内置命令,可根据指定的命令名显示shell将要执行的命令类型。格式如下

type command

  • 有时系统可能安装了一个可执行程序的多个版本,这种现象在大型服务器中很常见。使用which命令可以确定一个给定可执行文件的准确位置

which lswhich 命令只适用于可执行程序,而不适用于内置命令和命令别命(真正可执行程序的替代物)。

bash 为每个 shell 内置命令提供了一个内置的帮助工具。输入 help ,然后输入 shell 内置命令的名称就可使用该帮助工具。

help cd

很多可执行程序都支持 --help 选项,它描述了命令支持的语法和选项。

大多数供命令行使用的可执行文件,提供一个称之为 manual 或是 man page 的正式文档。干文档可以用一种成为 man 的特殊分页程序来查看,用法如下:

man program ,其中 program 是需要查看的命令名称。,大多数 Linux 系统中, man 命令调用 less 命令来显示手册文档,所以,当显示手册文档时,你熟悉的所有 less 命令都奏效。

apropos 显示合适的命令,我们可能会搜索参考手册列表,才进行基于某个搜索条目的匹配。尽管有些粗糙,但这种方法有时还是很有用的。

whatis 显示命令的简要描述,显示匹配具体关键字的手册页的名字和一行描述。

info 显示程序的 info 条目, info 页面可通过 info 阅读器来显示。 info 页面使用超链接,这与网页结构很相似。 info 程序读取 info 文件,该文件是树形结构,分为各个单独的节点,每个节点包含一个主题。 info 文件包含的超链接可以实现节点间的跳转。通过前置星号可以识别超链接,将光标放在超链接上并按 Enter 键,可以激活它。

  • ?显示命令帮助
  • n显示下一个节点
  • p显示上一个节点
  • u显示目前显示节点的如节点
  • ENTER进入光标所指的超链接
  • q退出

系统中安装的很多软件包都有自己的文档文件,它们存放在 /usr/share/doc 目录中,大部分文档是以纯文本格式来存储的,因此可以用 less 命令来查看,有些是 HTML 文件的,可以用Web浏览器来查看。如果是以 .gz 结尾的压缩文件,以 zless 这种特殊的 less 版本来查看压缩的文本文件的内容。

使用别命创建自己的命令

我们可以使用 alias 命令来创建自己的命令,我们可以使用分号来分割多条命令,就可以将多条命令输入在一行。其中工作方式如下:

command1;command2;command3...

注意 alias 命令的使用如下,注意在使用前应该使用 type 查看该命令是否使用过:

alias name='string'

删除别命可以使用 unalias