目录
操作文件和目录
cp — 复制文件和目录
mv — 移动/重命名文件和目录
mkdir — 创建目录
rm — 删除文件和目录
ln — 创建硬链接和符号链接
如果是简单的文件和目录操作任务,使用图形化界面的文件管理器会更容易些,但是对于复杂的文件操作任务,则使用命令行更方便,因为有通配符的存在。(eg:如何拷贝一个目录下的所有HTML文件)
通配符
因为 shell 频繁地使用文件名,shell 提供了特殊字符来帮助你快速指定一组文件名。这些特殊字符叫做通配符。使用通配符(文件名代换)允许你依据字符的组合模式来选择文件名。
接受文件名作为参数的任何命令,都可以使用通配符。
通配符 | 意义 |
---|---|
* | 匹配任意多个字符(包括零个或一个) |
? | 匹配任意一个字符(不包括零个) |
[characters] | 匹配任意一个属于字符集中的字符 |
[!characters] | 匹配任意一个不是字符集中的字符 |
[[:class:]] | 匹配任意一个属于指定字符类中的字符 |
字符类 | 意义 |
---|---|
[:alnum:] | 匹配任意一个字母或数字 |
[:alpha:] | 匹配任意一个字母 |
[:digit:] | 匹配任意一个数字 |
[:lower:] | 匹配任意一个小写字母 |
[:upper:] | 匹配任意一个大写字母 |
模式 | 匹配对象 |
---|---|
* | 所有文件 |
g* | 文件名以“g”开头的文件 |
b*.txt | 以"b"开头,中间有零个或任意多个字符,并以".txt"结尾的文件 |
Data??? | 以“Data”开头,其后紧接着3个字符的文件 |
[abc]* | 文件名以"a","b",或"c"开头的文件 |
BACKUP.[0-9][0-9][0-9] | 以"BACKUP."开头,并紧接着3个数字的文件 |
[[:upper:]]* | 以大写字母开头的文件 |
[![:digit:]]* | 不以数字开头的文件 |
*[[:lower:]123] | 文件名以小写字母结尾,或以 “1”,“2”,或 “3” 结尾的文件 |
字符范围
使用字符集的时候可以利用中划线表示字符范围,比如[a-e]、[1-6]。
通配符在 GUI 中也有效
- 在 Nautilus (GNOME 文件管理器)中,可以通过 Edit/Select 模式菜单项来选择文件。 输入一个用通配符表示的文件选择模式后,那么当前所浏览的目录中,所匹配的文件名就会高亮显示。
- 在 Dolphin 和 Konqueror(KDE 文件管理器)中,可以在地址栏中直接输入通配符。例如, 如果你想查看目录 /usr/bin 中,所有以小写字母 ‘u’ 开头的文件, 在地址栏中敲入 ‘/usr/bin/u*‘,则 文件管理器会显示匹配的结果。
创建目录
mkdir directory...
注意表示法:在描述一个命令时,当有三个圆点跟在一个命令的参数后面, 这意味着那个参数可以有多个。(eg:mkdir dir1 dir2 dir3)
复制文件和目录
可以将一个文件中的内容复制到另一个文件中。
cp item1 item2
可以复制单个或多个项目(文件和目录)到一个目录下。
cp item... directory
选项 | 意义 |
---|---|
-a, --archive | 复制文件和目录,以及它们的属性,包括所有权和权限。 通常,复本具有用户所操作文件的默认属性。 |
-i, --interactive | 在重写已存在文件之前,提示用户确认。如果这个选项不指定, cp 命令会默认重写文件。 |
-r, --recursive | 递归地复制目录及目录中的内容。当复制目录时, 需要这个选项(或者-a 选项)。 |
-u, --update | 当把文件从一个目录复制到另一个目录时,仅复制 目标目录中不存在的文件,或者是文件内容新于目标目录中已经存在的文件。 |
-v, --verbose | 显示翔实的命令操作信息 |
命令 | 运行结果 |
---|---|
cp file1 file2 | 复制文件 file1 内容到文件 file2。如果 file2 已经存在, file2 的内容会被 file1 的内容重写。如果 file2 不存在,则会创建 file2。 |
cp -i file1 file2 | 这条命令和上面的命令一样,除了如果文件 file2 存在的话,在文件 file2 被重写之前, 会提示用户确认信息。 |
cp file1 file2 dir1 | 复制文件 file1 和文件 file2 到目录 dir1。目录 dir1 必须存在。 |
cp dir1/* dir2 | 使用一个通配符,在目录 dir1 中的所有文件都被复制到目录 dir2 中。 dir2 必须已经存在。 |
cp -r dir1 dir2 | 复制目录 dir1 中的内容到目录 dir2。如果目录 dir2 不存在, 创建目录 dir2,操作完成后,目录 dir2 中的内容和 dir1 中的一样。 如果目录 dir2 存在,则目录 dir1 (和目录中的内容)将会被复制到 dir2 中。 |
移动和重命名文件
mv 命令可以执行文件移动和文件命名任务,这依赖于你怎样使用它。任何一种 情况下,完成操作之后,原来的文件名不再存在。
把文件或目录 “item1” 重命名为 “item2”。
mv item1 item2
把一个或多个条目从一个目录移动到另一个目录中。
mv item... directory
选项 | 意义 |
---|---|
-i --interactive | 在重写一个已经存在的文件之前,提示用户确认信息。 如果不指定这个选项,mv 命令会默认重写文件内容。 |
-u --update | 当把文件从一个目录移动另一个目录时,只是移动不存在的文件, 或者文件内容新于目标目录相对应文件的内容。 |
-v --verbose | 当操作 mv 命令时,显示翔实的操作信息。 |
mv file1 file2 | 移动 file1 到 file2。如果 file2 存在,它的内容会被 file1 的内容重写。 如果 file2 不存在,则创建 file2。 这两种情况下,file1 都不再存在。 |
mv -i file1 file2 | 除了如果 file2 存在的话,在 file2 被重写之前,用户会得到提示信息外,这个和上面的选项一样。 |
mv file1 file2 dir1 | 移动 file1 和 file2 到目录 dir1 中。dir1 必须已经存在。 |
mv dir1 dir2 | 如果目录 dir2 不存在,创建目录 dir2,并且移动目录 dir1 的内容到目录 dir2 中,同时删除目录 dir1。如果目录 dir2 存在,移动目录 dir1(及它的内容)到目录 dir2。 |
删除文件和目录
rm item...
选项 | 意义 |
---|---|
-i, --interactive | 在删除已存在的文件前,提示用户确认信息。 如果不指定这个选项,rm 会默默地删除文件 |
-r, --recursive | 递归地删除文件,这意味着,如果要删除一个目录,而此目录 又包含子目录,那么子目录也会被删除。要删除一个目录,必须指定这个选项。 |
-f, --force | 忽视不存在的文件,不显示提示信息。这选项覆盖了“--interactive”选项。 |
-v, --verbose | 在执行 rm 命令时,显示翔实的操作信息。 |
命令 | 运行结果 |
---|---|
rm file1 | 默默地删除文件 |
rm -i file1 | 除了在删除文件之前,提示用户确认信息之外,和上面的命令作用一样。 |
rm -r file1 dir1 | 删除文件 file1, 目录 dir1,及 dir1 中的内容。 |
rm -rf file1 dir1 | 同上,除了如果文件 file1,或目录 dir1 不存在的话,rm 仍会继续执行。 |
小贴士: 当你使用带有通配符的rm命令时(除了仔细检查输入的内容外), 先用 ls 命令来测试通配符。这会让你看到将要被删除的文件是什么。然后按下上箭头按键,重新调用刚刚执行的命令,用 rm 替换 ls。
命令的使用
type – 说明怎样解释一个命令名
which – 显示会执行哪个可执行程序
man – 显示命令手册页
apropos – 显示一系列适合的命令
info – 显示命令 info
whatis – 显示一个命令的简洁描述
alias – 创建命令别名
什么是命令
命令可以是下面四种类型之一:
-
是一个可执行程序,就像我们所看到的位于目录/usr/bin 中的文件一样。 这一类程序可以是用诸如 C 和 C++语言写成的程序编译的二进制文件, 也可以是由诸如shell,perl,python,ruby等等脚本语言写成的程序 。
-
是一个内建于 shell 自身的命令。bash 支持若干命令,内部叫做 shell 内部命令 (builtins)。例如,cd 命令,就是一个 shell 内部命令。
-
是一个 shell 函数。这些是小规模的 shell 脚本,它们混合到环境变量中。 在后续的内容里,我们将讨论配置环境变量以及书写 shell 函数。但是现在, 仅仅意识到它们的存在就可以了。
-
是一个命令别名。我们可以定义自己的命令,建立在其它命令之上。
显示命令的类型
type 命令是 shell 内部命令,它会显示命令的类别。
type command
显示一个可执行程序的位置
which command
这个命令只对可执行程序有效,不包括内建命令和命令别名,别名是真正的可执行程序的替代物。 当我们试着使用 shell 内建命令时,例如,cd 命令,我们或者得不到回应,或者是个错误信息。
在zsh中,显示命令位置的关键字是where。
得到 shell 内建命令的帮助文档
help command
注意表示法:出现在命令语法说明中的方括号,表示可选的项目。一个竖杠字符表示互斥选项。(eg:cd [-L|-P] [dir])
显示用法信息
许多可执行程序支持一个 --help 选项,这个选项是显示命令所支持的语法和选项说明。
command --help
显示程序手册页
许多希望被命令行使用的可执行程序,提供了一个正式的文档,叫做手册或手册页(man page)。
man command
在大多数 Linux 系统中,man 使用 less 工具来显示参考手册,所以当浏览文档时, less 命令都能有效。
man 所显示的参考手册,被分成几个章节,它们不仅仅包括用户命令,也包括系统管理员命令、程序接口、文件格式等等。
章节 | 内容 |
---|---|
1 | 用户命令 |
2 | 程序接口内核系统调用 |
3 | C 库函数程序接口 |
4 | 特殊文件,比如说设备结点和驱动程序 |
5 | 文件格式 |
6 | 游戏娱乐,如屏幕保护程序 |
7 | 其他方面 |
8 | 系统管理员命令 |
我们可以指定章节号来查看需要的信息。尤其是如果我们要查找一种文件格式,而同时它也是一个命令名时,不指定章节号将总是得到第一个匹配项。
man chapternumber command
显示适当的命令
apropos keyword
基于关键词,搜索参考手册列表中可能的匹配项。
输出结果每行的第一个字段是手册页的名字,第二个字段展示章节。注意,man 命令加上”-k”选项, 和 apropos 完成一样的功能。
显示非常简洁的命令说明
whatis 程序显示匹配特定关键字的手册页的名字和一行命令说明。
whatis command
显示程序 Info 条目
GNU 项目提供了一个命令程序手册页的替代物,称为”info”。info 内容可通过 info 阅读器 程序读取。info 页是超级链接形式的,和网页很相似。
info command
info 程序读取 info 文件,info 文件是树型结构,分化为各个结点,每一个结点包含一个题目。 info 文件包含超级链接,可以让你从一个结点跳到另一个结点。超级链接可通过它开头的星号来辨别出来,把光标放在它上面并按下 enter 键,就可以激活它。
命令 | 行为 |
---|---|
? | 显示命令帮助 |
PgUp or Backspace | 显示上一页 |
PgDn or Space | 显示下一页 |
n | 下一个 - 显示下一个结点 |
p | 上一个 - 显示上一个结点 |
u | Up - 显示当前所显示结点的父结点,通常是个菜单 |
Enter | 激活光标位置下的超级链接 |
q | 退出 |
我们所讨论的大多数命令行程序,属于 GNU 项目”coreutils”包,所以输入:info coreutils 将会显示一个包含超级链接的手册页,这些超级链接指向包含在 coreutils 包中的各个程序。
README 和其它程序文档
许多安装在系统中的软件,都有自己的文档文件,这些文件位于/usr/share/doc 目录下。 这些文件大多数是以文本文件的形式存储的,可用 less 阅读器来浏览。一些文件是 HTML 格式, 可用网页浏览器来阅读。我们可能遇到许多以”.gz”结尾的文件。这表示 gzip 压缩程序 已经压缩了这些文件。gzip 软件包包括一个特殊的 less 版本,叫做 zless,zless 可以显示由 gzip 压缩的文本文件的内容。
用别名(alias)创建自己的命令
命令行小技巧,我们可以把多个命令放在同一行,命令之间用";"分开即可。
command1; command2; command3...
通过 alias 命令可以把这一串命令转变为一个命令。
alias new_command='command1; command2; command3...'
删除别名,使用 unalias 命令。
unalias new_command
虽然要尽量避免使用已经存在的命令名来命名别名,但是通常我们会把一个普遍用到的参数选项加到常用的命令后面。(例如 ls 命令,其实是 ls --color=tty 的别名,加入了色彩支持)
注意:在命令行中定义的别名,是有生命周期的。当你的 shell 会话结束时,它们会消失。如果希望别名一直存在,需要为其配置系统环境。