💎一站式轻松地调用各大LLM模型接口,支持GPT4、智谱、星火、月之暗面及文生图 广告
**入门及基本操作命令** [TOC] ## 第2章 导航文件系统`ls pwd cd` 2.1 列出文件和文件夹`ls` 2.2 列出其他文件夹的内容`ls [folder]` 2.3 使用通配符列出文件夹的内容`ls *` 2.4 查看子文件夹中的文件列表`ls -R` 2.5 以单独一列显示内容列表`ls -l` 2.6 以逗号分隔列表显示内容 `ls -m` 2.7 查看隐藏的文件和文件夹 `ls -a` 2.8 直观显示文件的类型 `ls -F` ?? 2.9 以各种颜色显示内容`ls --color` 2.10 列出权限,所有者以及其他信息 `ls -l` 2.11 以倒序列出文件内容`ls -r` 2.12 按日期和时间排序内容`ls -t` 2.13 按文件大小排序内容`ls -S` 2.14用K,M和G表示文大小`ls -h` 2.15 显示当前目录的路径`pwd` `pwd`: printing working directory 2.16 改为不同的目录`cd` 2.17 改为home目录`cd ~` 2.18 改为之前的目录`cd -` ## 第3章 创建和销毁`touch mkdir cp mv ln rm rmdir` 3.1 将文件改为当前时间`touch` `tough -a xx.txt`: 只更新文件‘xx.txt’的访问时间 `touch -m xx.txt`: 只更新文件‘xx.txt’的修改时间 >[info] 只有获得文件写入权限才可对文件使用`touch`命令修改文件时间。否则,该命令将会运行失败。 3.2 将文件改为任意所需的时间`touch -t` `touch -t[[CC]YY]MMDDhhmm[.ss]` ?? 3.3 新建空文件`touch xx` 3.4 新建目录`mkdir xx` >[info] 在大多数系统中,使用`mkdir`命令创建的新目录会赋予所有者读取(r)、写入(w)和执行(x)的权限,而只赋予组及其它用户读取(r)和执行(w)的权限。 要想更改这些设置,可使用`chmod`命令。 3.5 创建新目录以及必要的子目录`mkdir -p` `mkdir -p picture/personal/family` 在当前目录下依次创建了picture、personal、family三级目录。 3.6 复制文件`cp` `cp source [target]` 3.7 使用通配符复制文件`cp *` 3.8 显示复制文件的过程`cp -v` 3.9 防止在复制时覆盖重要文件`cp -i` 3.10 复制目录`cp -r` 目录及其内容都会被复制。 3.11 为建立完善副本而将文件复制到另一个目录`cp -a` 确保`cp`命令不会复制软链接的内容(可能极大地增加复制量),而保存关键的文件属性(所有者,时间戳),并递归处理子目录。 3.12 移动文件和文件夹`mv` `mv source [target]` `cp`和`mv`命令有很多选项是相同的。比如: `-i`:在复制和移动文件时交互提示是否覆盖已有文件。 `-v`:在复制和移动文件是显示执行过程。 3.13 重命名文件和文件夹`mv` 条件:home目录中有一个名为‘dogs’的软链接(指向/home/scott/picture/dogs),要将该软链接移动到/home/scott/libby子目录中 1. `$mv dogs ~/libby`: 只移动软链接本身 2. `$mv dogs/ ~/libby`: 软链接后面多了一个`/`,则移动软链接所指向的目录,而不是软链接本身。 3.14 理解Linux存储文件的方式`df -ih` 在Linux中一切皆文件。那么,是什么使得某个文件成为文件呢? 实际情况是,我们所看到的文件是**指向索引节点的指针**:这是一种数据结构,其中存储有关物理数据在计算机上的具体位置的信息,还存储了与数据有关的**元数据**: * 文件类型 * 大小 * 修改时间 * 所有权 * 权限等(参见第2章和第8章以了解更多相关信息)。 在创建文件时,文件系统会为其分配一个独特的索引节点号,而用户会为其分配一个名称,这两者都存储在驱动器上的索引节点表中。可通过其名称引用某个文件,Linux会使用该名称查询关联的索引节点。Linux获得存储在索引节点中的信息之后,就可以对该文件进行操作。 如果要查看与文件关联的索引节点号,可使用`ls -i`命令: ~~~linux $ ls -i 49889 backup daily.sh 49796 dotfiles/ 49795 dotfiles.sh 49886 extra/ 49291 wp upgrade.sh ~~~ 上述文件或目录左边的编号就是索引节点号。 目录或文件夹是一个文件(有着自己的索引节点),该文件将其内部的文件与对应的索引节点关联起来。 大多数文件系统都会创建固定数量的索引节点,因此从理论上来说,如果索引节点已经用完,那么即使有大量的磁盘空间,也无法创建更多文件(这种情况很少见,但作者就曾经遇到过一次)。如果你想知道文件系统拥有的索引节点数以及剩余的可用索引节点数,可使用第13章将介绍的df命令,但要使用-h(便于用户阅读)和-i(或--inodes)选项,可看到类似下面的结果: ~~~linux $ df -h Filesystem Size Used Avail Use% Mounted on /dev/sda 4.9G 742M 4.1G 16% / none 396M 308K 395M 1% /run /dev/sdb 42G 33G 8.8G 79% /var $ df -i Filesystem Inodes Iused IFree IUse% Mounted on /dev/sda 327680 40627 287053 13% / none 505701 826 504875 1% /run /dev/sdb 2785280 706754 2078526 26% /var ~~~ 可以看到`/var `使用了 79%的空间,但仅使用26%的可用索引节点。 在此情况下,你就可以创建大批量的小文件。 3.15 创建指向另一个文件或目录的链接`ln` `ln`:link的简写 `硬链接`:?? `软链接`:?? 3.16 删除文件`rm` `rm`:remove的简写。彻底从磁盘上删除文件,文件不存在。 `shred -n#`:将文件删除后重写#次(最多25次)。确保绝对无人能够恢复删除的文件。但该命名是否能够成功执行很大程度上依赖正在使用的文件系统类型。 3.17 使用通配符一次性删除多个文件`rm *` 3.18 防止删除关键文件`rm -i` 在删除每个文件之前,会要求确认删除 3.19 删除空目录`rmdir` 3.20 删除文件和非空的目录`rm -rf` 删除目录及其中所有文件及子目录的稳妥方法。 >[warning] 谨慎使用通配符 > `rm -rf ~/libby/*`,删除`~/libby`目录下的文件及子目录 > `rm -rf ~/libby /*`,删除`~/libby`目录和根目录下的文件及子目录 >[danger] 不要输入 > `rm -rf /*` > 上述命令将删除整个系统!!! >[danger] 永远不要输入 > `rm -rf .*/*` > 上述命令在删除以`.`为名称开头的目录后,还会匹配`..`而删除当前工作目录的上级目录中的所有数据。 3.21 删除难缠的文件 1. 删除文件名中带有空格的文件 `$ rm "dog cat.jpg"` 2. 删除文件名以`-`开头的文件 `$ rm -- -dogCat.jpg` `$ rm ./-dogCat.jpg` ## 第4章 学习命令`man info whatis whereis which type` 4.1 使用man查找命令相关信息`man` 一般`man`查询的命令手册内容包括如下部分 * NAME(命令名称):命令的名称和简要的介绍。 * SYNOPSIS:命令的基本格式。 * DESCRIPTION(描述):描述命令功能的概要介绍。 * OPTIONS(选项)-man 命令最基本的部分:命令的各种选项,以及对每个选项的简短介绍。 * FILES(文件):命令使用的其他文件。AUTHOR(作者)编写命令的作者,以及联系信息。 * BUGS(错误):已知的错误,以及如何拔告新错误。 * COPYRIGHT(版权声明):版权信息。 * SEE ALSO(参见):其他相关的命令。 4.2 基于命令的名称来快速弄清其功能`man -f` `whatis` 不需要打开命令的手册而快速知道命令的功能 ~~~linux $ man -f ls ls (1) - list directory content $ whatis ls ls (1) - list directory content ~~~ `whatis` 命令的另一个重要优点是支持正则表达式和通配符。要用通配符搜索`man` 数据库,可以使用`-w`选项(或`--wildcard`)。 ~~~linux $ whatis -w ls* ls (1) - list directory contents lsb (8) -Linux Standard Base support for Debian lshal (1) -List devices and their properties lshw (1) -list hardware lskat (6) -Lieutnant Skat card game for KDE ~~~ 与不使用选项的`whatis`命令相比,使用通配符可能会让搜索速度稍微慢一些,但是对于当今运行速度越来越快的计算机来说,这种影响是微不足道的。 正则表达式可以和`-r`(或`--regex`)选项一起使用: ~~~linux $ whatis -r ^rm.* rm (1) -remove files or directories rmail (8) -handle remote mail received via uucp rmdir (1) -remove empty directories rmt (8) -remote magtape protocol module ~~~ 4.3 基于其功能搜索命令`man -k` `apropos` 如果对命令能完成的功能有一定的了解,但不知道命令的实际名称,该怎么办呢?这时可以试试 man 命令的`-k`选项(或`--apropos`),或者干脆使用 `apropos` 命令,来搜索一 个描述所需查找命令的词或短语。 搜索的结果是一个命令列表,列出了其名称或简单说明能够匹配搜索词的所有命令。 ~~~linux $ man list No manual entry for list $ man -k list last (1) -show listing of last logged in users ls (1) -list directory contents lshw (1) -list hardware lsof (8) -list open files $ apropos -e list ls (1) - list directory contents lshw (1) -list hardware lsof (8) -list open files ~~~ 4.4 读取命令的特定手册页面`man [1~8]` 各个命令的手册页面按照其类型分成了不同的部分,数字从1到8。划分的各部分如下所示: (1)普通命令。如 `cd`,`chmod`、`lp`,`mkdir`和`passwd` (2)由内核提供的底层系统调用。如`gettimeofday`,`fork`和`chmod`。 (3)C库函数,如`beep`,`HTML::Parser` 和`Mail:Internet`。 (4)特殊文件,如`/dev`中找到的设备,包括控制台(console),打印机(Ip)和鼠标(mouse)。 (5)文件格式和约定,如`apt.conf`,`dpkg.cfg`,`hosts` 和`passwd`。 (6)游戏,如 atlantik,bouncingcow,kmahjongg和 rubik。 (7)杂项,包括宏包,如ascii,samba和utf-8. (8)root用户使用的系统管理命令,如`mount`和`shutdown`。 4.5 使用 info学习命令`info` 4.6 在info页面中导航 4.7 查找命令的可执行文件、源文件和手册页面的路径`whereis [-bsm]` ~~~linux $ whereis kword kword: /usr/src/koffice-1.4.1/kword /usr/bin/kword /usr/bin/X11/kword usr/share/man/man1/kword.1.gz ~~~ whereis 命令首先报告源文件的位置: `/usr/src/koffice-1.4.1/kword`; 接着报告任何二进制可执行文件的位置: `/usr/bin/kword` 和`/usr/bin/X11/kword`.在这台计算机的两个位置都能找到KWord,虽然有些不寻常,但也不算奇怪。 最后找到的是手册页面的位置: `/usr/share/man/man1/kword.1.gz`。 有了上述信息后,现在就能够确认这台计算机上确实已经安装了这个程序,而且也知道如何运行它。 如果只想搜索二进制文件路径,可以使用`-b`选项,如下所示: ~~~linux $ whereis -b kword kword:/usr/bin/kword/usr/bin/x11/kword ~~~ 如果只想搜索手册页面路径,可使用`-m`选项,如下所示: ~~~linux $ whereis -m kword kword:/usr/share/man/man1/kword.1.gz ~~~ 最后,如果只想搜索源文件路径,可以尝试使用`-s`选项,如下所示: ~~~linux $ whereis -s kword kword:/usr/src/koffice-1.4.1/kword ~~~ 4.8 找出将要运行的命令的版本`which [-a]` 回想一下`whereis`命令,以及用`-b`选项只查询KWord的二进制文件信息时发生的情况。 ~~~linux $whereis -b kword kword: /usr/bin/kword /usr/bin/X11/kword ~~~ 在两个位置都有KWord的可执行文件。但是哪一个文件会先运行呢?运行`which` 命令就可以得到答案。 ~~~linux $ which kword /usr/bin/kword ~~~ 只要输入命令的名称,`which`命令就能告诉你这个命令的哪个版本将会运行。即是:如果输入kword,然后按Enter键,shell 将会执行`/usr/bin`目录下找到的`kword `程序。 如果想运行`/usr/bin/X11`目录下的版本,必须用 cd 命令切换目录,然后输入`./kword`,或者是使用命令的绝对路径,输入`/usr/bin/X11/kword`。 `which`命令也是一种快速判断系统中是否存在特定命令的方法。如果在系统中有相应的命令,而且该命令位于`PATH`中,`which` 命令将告诉你在何处可以找到这个命令。 如果命令不存在,就不会在命令行中返回任何信息。 ~~~linux $ which arglebargle $ ~~~ 如果要查找命令的所有位置(就像使用 whereis-b一样),可以使用-a(表示all)选项。 ~~~linux $ which -a kword /usr/bin/kword /usr/bin/X11/kword ~~~ 4.9 揭示shell如何解释命令`type [-ta]` type 命令显示bash如何解释你运行的命令,例如: ~~~ $ type ls ls is aliased to '/bin/ls-F--color' $ type cd cd is a shell builtin $ type whereis whereis is /usr/bin/whereis $ type mark mark is a function mark () { mkdir -p "SMARKPATH"; ln -s "$(pwd)" "SMARKPATH/$1" } $ type do do is a shell keyword ~~~ ![](../images/360截图163904049710298.jpg) type 命令的输出表明 bash如何对待每个命令。有5种可能的答案: * alias:你所创建的软链接,包括别名的目标文件。这对于硬链接没有效果,不会显示任何内容。 * builtin:内置于bash中且自身直接运行的会令,与调用外部程序相对。内建函数的示例有`alias`,`cd`,`echo`,`history`,`source` 和`type`。 * file:未内置于shell 的命令,该命令于外部调用。例如:`whereis`和`whatis`。 * function:由Linux、软件或用户创建的函数。与别名类似,`type`也会输出函数的实际内容。 * keyword:仅由bash使用的保留字,如`do`、`for`、`if`、`then`、`while`和`!`。 如果只想查看这五种中的哪一种适用于特定顺命令,可使用`-t`选项。 ~~~linux $ type -t ls alias $ type -t cd builtin $ type -t mark function ~~~ 这段代码非常简洁。`-a`选项的结果会长一些,因为它不仅提供命令类型, 也提供可找到该命令的所有位置。 ~~~linux $ type -a ls ls is aliased to '/bin/ls -F--color' ls is /bin/ls ~~~ 现在我们知道了 ls是别名,以及别名的目标和源命令的路径. type 不是我们每天都会使用的命令,但如果你想知道为什么命令没有按照预期方式执行操作,type 将帮助你了解问题所在。 ## 第5章 组合命令`; && || $() | stdin stdout stderr > >> < tee` 5.1 连续运行多个命令`;` 命令栈是将所有需要运行的命令放到 shell中的一行上,每条命令之间用分号`;`隔开。然后按 顺序依次执行每个命令,只有一条命令结束运行(成功或失败),才会运行下一条命令。 这很容易实现,也确实能够节省时间。 >[danger] 在删除或移动文件时确保输入你希望执行的命令,因为这些命令将依次执行,即使前一条命令失败也会继续执行,因此最终可能产生意料之外的结果。 5.2 仅在前面的命令成功运行时才运行下一条命令`&&` 示例: ~~~ $ ps2pdf foobar.ps && lpr foobar.pdf && rm foobar.ps ~~~ 如上所示,使用`ps2pdf`命令把PostScript 文件转换成PDF文件,再打印生成的PDF 文件,之后删除 PostScript 文件。如果使用分号,万一`ps2pdf`命令失败,PostScript文件将被彻底删除,让你想再来一次都没办法。 5.3 仅在前面的命令运行失贝文时才运行下一条命令`||` 5.4 将一条命令的输出插入另一条命令`$()` 5.5 理解输入/输出流`stdin stdout stderr` 5.6 将一条命令的输出用作另一条命令的输入`|` 5.7 将命令的输出重定向到文件`>` 5.8 防止重定向时覆盖文件`set -o noclobber` 5.9 将命令的输出追加到文件中`>>` 5.10 将文件用作命令的输入`<` 5.11 结合使用输入和输出重定向 5.12 将输出同时发送到文件和stdout`tee`